至少有三种技术可以检测文件是否存在:
- 查询文件属性
- 使用具有特定文件名而不是搜索模式的 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。在每种情况下,第一次访问文件的尝试都指示“找不到文件”,但连续第二次尝试会导致无错误(找到文件)。
我无法开始解释这些结果。我认为此时我需要在本地运行所有测试,以从混合中删除网络文件共享。这些结果并没有使整个 heckuva 很有意义(对我来说)。
文件夹的 fltmc 输出,来自服务器上的本地管理员帐户:
Filter Name Num Instances Altitude Frame
------------------------------ ------------- ------------ -----
aksdf 8 145900 0
luafv 1 135000 0