我需要获取文件夹中子文件夹的所有路径(使用 WinAPIs 和 C++。)到目前为止,我发现的唯一解决方案是递归调用FindFirstFile / FindNextFile但在具有更深层次结构的文件夹上执行此操作需要大量时间.
所以我想知道,只是为了获取文件夹名称,有没有更快的方法?
我需要获取文件夹中子文件夹的所有路径(使用 WinAPIs 和 C++。)到目前为止,我发现的唯一解决方案是递归调用FindFirstFile / FindNextFile但在具有更深层次结构的文件夹上执行此操作需要大量时间.
所以我想知道,只是为了获取文件夹名称,有没有更快的方法?
如果您真的只需要子文件夹,您应该能够使用FindFirstFileEx
搜索
选项来过滤掉非目录。
文档建议这只是一个建议标志,但您的文件系统可能支持这种优化 - 试一试。
FindExSearchLimitToDirectories
这是一个咨询标志。如果文件系统支持目录过滤,则该函数会搜索与指定名称匹配且也是目录的文件。如果文件系统不支持目录过滤,这个标志会被忽略。
一种更快的方法是绕过FindFirstFile...()
API 直接进入文件系统。您可以使用DeviceIoControl()
控件FSCTL_ENUM_USN_DATA
访问主文件表,至少在 NTFS 格式的卷上。有了这些信息,您可以直接访问文件/文件夹的记录,其中包括它们的属性、父信息等。是的,它会做更多的工作,但它也应该更快,因为您可以优化代码以仅访问片段你需要。
这是你能遇到的最快的方法。您也可以考虑使用另一个线程来管理目录枚举,因为这需要很多时间。如果目录有很多子文件夹/文件,即使 Microsoft 文件资源管理器也会花费一些时间。
这里还有一件事是您可以枚举目录一次,然后注册任何更新。所以枚举文件夹的成本应该只在启动期间进行一次。