【问题标题】:Is there a faster alternative to enumerating folders than FindFirstFile/FindNextFile with C++?枚举文件夹是否有比使用 C++ 的 FindFirstFile/FindNextFile 更快的替代方法?
【发布时间】:2013-02-27 09:06:17
【问题描述】:

我需要获取文件夹中子文件夹的所有路径(使用 WinAPIs 和 C++。)到目前为止,我发现的唯一解决方案是递归调用 FindFirstFile / FindNextFile 但这样做需要大量时间在具有更深层次结构的文件夹上。

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

【问题讨论】:

  • 如果启用了索引服务,您可以尝试使用它。
  • @RaymondChen:你的意思是我自己做索引(就像下面建议的 Mahmoud Fayez)?或者我可以重复使用 Windows 已经完成的索引吗?
  • 我的意思是the built-in one
  • @EugeneMayevski'EldoSCorp:抱歉,该帖子没有提供任何可行的替代方案。我喜欢 Raymond 建议更好地使用内置索引,甚至是 FindFirstFileEx API。只需要弄清楚如何实现它......完成后会发布更新。

标签: c++ winapi filesystems directory


【解决方案1】:

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

文档建议这只是一个建议性标志,但您的文件系统可能支持这种优化 - 试试看。

FindExSearchLimitToDirectories

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

【讨论】:

  • 此外,将 FindFirstFileEx 与 FIND_FIRST_EX_LARGE_FETCH 一起使用可能比仅使用 FindFirstFile 快很多。
  • FindFirstFileEx 比 FindFirstFile 慢得多。我不推荐使用这个。
【解决方案2】:

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

【讨论】:

  • 好主意。我设想的唯一问题——我的流程是否需要运行提升才能做到这一点?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 2013-07-22
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多