有效地列出目录中的所有子目录



请参阅目前为止的建议编辑…

我正在尝试使用WinAPI列出给定目录中的所有目录(文件夹);c++。

现在我的算法很慢&效率:
-使用FindFirstFileEx()打开我正在搜索的文件夹
-然后查看目录中的每个文件(使用FindNextFile());如果它是一个目录文件,那么我将它的绝对路径存储在一个向量中,如果它只是一个文件,我什么都不做。

这看起来非常低效,因为我要查看目录中的每个文件。

  • 是否有一个WinAPI函数,我可以使用它来告诉我给定目录中的所有子目录?
  • 你知道一个算法我可以用来有效地定位&识别目录(文件夹)中的文件夹?
编辑:

因此,在接受建议后,我使用FindExSearchLimitToDirectories搜索,但对我来说,它仍然打印出所有文件(.txt等)&不仅仅是文件夹。我做错了什么吗?

WIN32_FIND_DATA dirData;
HANDLE dir = FindFirstFileEx( "c:/users/soribo/desktop\*", FindExInfoStandard, &dirData, 
                              FindExSearchLimitToDirectories, NULL, 0 );
while ( FindNextFile( dir, &dirData ) != 0 )
{
    printf( "FileName: %sn", dirData.cFileName );
}

为了看到性能提升,必须在文件系统级别提供支持。如果不存在,则系统必须枚举目录中的每个对象。

原则上,可以使用FindFirstFileEx指定FindExSearchLimitToDirectories标志。然而,文档声明(强调我的):

这是一个警告标志。如果文件系统支持目录过滤,则搜索与指定名称匹配的文件,该文件即为目录。如果文件系统不支持目录过滤,该标志将被静默忽略。

如果需要目录过滤,这个标志可以在所有文件系统上使用,但是因为它是一个建议标志,只影响支持它的文件系统,应用程序必须检查存储在FindFirstFileEx函数的lpFindFileData参数中的文件属性数据,以确定该函数是否返回了目录的句柄

然而,据我所知,信息是稀疏的,FindExSearchLimitToDirectories标志在桌面文件系统中并没有被广泛支持。

您最好的选择是使用FindFirstFileExFindExSearchLimitToDirectories。如果遇到不支持文件系统级目录过滤的文件系统,您仍然必须执行自己的过滤。如果您幸运地找到一个支持它的文件系统,那么您将获得性能上的好处。

如果您正在使用FindFirstFileEx,那么您应该能够指定_FINDEX_SEARCH_OPS::FindExSearchLimitToDirectories选项(在FindFirstFileEx中用作fSearchOp参数)以限制对目录的第一次搜索(以及任何后续的FindNextFile())调用。

最新更新