至少有三种技术可以检测文件是否存在:
- 查询文件属性
- 使用 FindFile() 和特定文件名而不是搜索模式
- 以读取模式打开文件并查看由此产生的错误
以上所有内容似乎都存在误报问题。也就是说,我被告知该文件实际上并不存在,因为网络上的 file-io 工作方式出现故障,或者由于文件权限问题。
我有一位客户可以看到资源管理器中存在一个文件,并删除该文件,但如果他们尝试查看该文件,则会收到“访问被拒绝”的消息。
我未能成功复制这种确切的行为。但我可以创建的是文件存在的情况,但由于限制权限,我无法在我的用户凭据下看到该文件夹中的文件。也就是说,GetFileAttributes()、FindFile() 和 fopen() 返回失败,即找不到该文件的文件(但如果我在不同帐户下查看同一文件夹 - 比如说网络管理员,我可以看到该文件肯定存在)。
至于我的最终用户(或任何人)在这种情况下最终会如何,对我来说是不透明的。我没有具体的想法 - 也许在文件先前打开时出现电源故障,也许某种网络故障导致文件句柄保持锁定到外国 PC 上的死进程,...?我只是编造一些东西,因为我不知道什么会导致这种情况发生。
但是,我真正不具备的是查询 Windows 并了解“文件 X 是否存在”这一事实的能力
有谁知道一种技术可以诚实地回答这个问题,无论用户的权限如何(假设他们被允许查询文件夹本身的内容 - 我不是要求未经授权的访问场景 - 只是一个“正常”用户X无法编辑文件Y,但仍想知道文件Y是否存在。
Hokay - 这变得很奇怪。
只要我问两次,使用任何文件检测技术都可以。第一次总是告诉我“不存在”。 Second+ 告诉我“是的,它就在那里,但你无法打开它。”
相关文件位于 Windows Server 2008 NTFS 驱动器上的共享文件夹中。它是共享的,供每个人完全控制。我已手动将“Everyone Deny Read”ACL 添加到文件中,以模拟我的客户问题。因此,我拒绝读取,但没有其他访问权限,并且仅限于文件,而不是共享或该文件所在的文件夹。
(我使用资源管理器进行此修改,而不是我自己的软件或命令行实用程序)。
我可以从该服务器上的本地管理员帐户看到该文件存在。我什至无法从我的本地工作站看到它存在,在 Windows 7 下以标准用户身份登录、启用 UAC、未提升的资源管理器/应用程序。
如果文件的读取访问被明确拒绝,则该文件将不再可见(除了不适用该拒绝的帐户,或具有某种后门方式的本地管理员)尽管拒绝 ACL 仍可查看该文件)。
我尝试过 FindFirstFile、GetAttributes、CreateFile、_taccess_s 和 PathFileExists。在每种情况下,第一次尝试访问文件都会指示“未找到文件”,但连续第二次尝试会导致无错误(找到文件)。
我无法开始解释这些结果。我认为此时我需要在本地运行所有测试,以从组合中删除网络文件共享。这些结果对我来说没有多大意义。
来自服务器上本地管理员帐户的文件夹的 fltmc 输出:
Filter Name Num Instances Altitude Frame
------------------------------ ------------- ------------ -----
aksdf 8 145900 0
luafv 1 135000 0
最佳答案
有一个名为 access
的 POSIX 函数可以执行此操作。看起来有一个 Windows 等效的 _access
:http://msdn.microsoft.com/en-us/library/1w06ktdy(v=vs.80).aspx
关于c++ - 如何检测文件是否存在而不会因权限问题而脱轨?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11247980/