0

出于我的目的,我希望优化从 Windows 上的 NTFS 文件系统上的给定文件夹递归枚举子文件夹的方法,我在 Microsoft 的FindFirstFile API页面上发现了这个小“宝石”:

注意 在极少数情况下或在负载较重的系统上,NTFS 文件系统上的文件属性信息在调用此函数时可能不是最新的。要确保获得当前的 NTFS 文件系统文件属性,请调用GetFileInformationByHandle函数。

所以,让我试着理解它。

我确实依靠结构中dwFileAttributes返回的参数WIN32_FIND_DATA来告诉文件夹中的文件。所以这个注释表明在某些情况下我可能会得到一些虚假的结果,对吧?如果是这样,为什么不在他们的更新中修复它而不是在这里发布呢?

还有他们建议的使用 GetFileInformationByHandle API 的解决方法。我到底应该怎么称呼它?它需要一个文件句柄。那么他们真的希望我们打开FindNextFile返回的每个文件并调用GetFileInformationByHandle它吗?你能想象用这种方法我的优化会“走多远”?

无论如何,如果有人能对此有所了解,那就太好了......

4

3 回答 3

4

从文件夹中区分文件是可以的,因为该信息可能是不变的。文件没有变成文件夹或文件夹变成文件。

文档说“可能不是最新的”,因为其他进程可能正在更改属性,并且没有锁定机制来同步属性正在懒惰地编写。如果您的应用程序需要绝对最新的信息,您可以检索它...ByHandle 以确保信息是最新的。

于 2013-03-18T03:13:59.220 回答
2

这是每个状态报告功能的工作方式。充其量,它会在您调用函数和函数返回之间的某个未定义点报告状态。但它并没有“冻结世界”以确保数据在以后仍然有效。

文档通常不会在每个单独的功能上都注明这一点,而是在没有考虑到这一点的情况下,通常只在可能导致严重问题,特别是安全问题的功能上注明。

如果您打开一个文件并获得它的句柄,则可以确保使用该句柄的所有操作都将针对同一个底层文件。但是当您按名称执行操作时,就没有这样的保证了。可以创建、删除和重命名文件。所以同名以后可能不会引用同一个文件。

于 2013-03-18T03:24:42.683 回答
1

dwFileAttributes在分辨文件和文件夹之间的区别时,这并不是不可靠的东西。我认为该注释是指可能缓存以供文件系统更新的信息(修改/访问的时间戳等),但项目是文件还是文件夹不会改变。

于 2013-03-18T03:11:58.043 回答