使用C ++比使用FindFirstFile / FindNextFile枚举文件夹有更快的替代方法吗?

时间:2013-03-12 00:40:23

标签: c++ winapi filesystems directory

我需要获取文件夹中子文件夹的所有路径(使用WinAPI和C ++。)到目前为止,我找到的唯一解决方案是递归调用FindFirstFile / FindNextFile,但需要大量的是时候在具有更深层次结构的文件夹上执行此操作。

所以我想知道,只是为了获取文件夹名称,是否有更快的方法?

3 个答案:

答案 0 :(得分:4)

如果你真的只需要子文件夹,你应该可以使用FindFirstFileEx search options过滤掉非目录。

文档建议这只是一个咨询标志,但您的文件系统可能支持此优化 - 尝试一下。

  

FindExSearchLimitToDirectories

     

这是一个咨询标志。如果是文件   系统支持目录过滤,该功能搜索文件   与指定的名称匹配,也是一个目录。如果是文件   系统不支持目录过滤,这个标志是静默的   忽略。

答案 1 :(得分:2)

这是您遇到的最快的方法。您也可以考虑使用另一个线程来管理目录枚举,因为它需要花费很多时间。如果目录中有很多子文件夹/文件,甚至Microsoft文件浏览器都会花一些时间。

此处还有一件事是您可以枚举目录一次,然后注册任何更新。所以枚举文件夹的成本应该只在启动时进行一次。

答案 2 :(得分:2)

更快的方法是绕过FindFirstFile...() API并直接转到文件系统。您可以使用DeviceIoControl()FSCTL_ENUM_USN_DATA控件来访问主文件表,至少在NTFS格式化卷上。有了这些信息,您就可以直接访问文件/文件夹的记录,其中包括它们的属性,父信息等。是的,它会更有效,但它也应该更快,因为您可以优化代码来访问这些部分你需要。