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

时间:2011-09-03 07:32:20

标签: c++ algorithm file winapi

请参阅编辑并提供迄今为止的建议......

我正在尝试使用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: %s\n", dirData.cFileName );
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

原则上,您可以使用FindFirstFileEx指定FindExSearchLimitToDirectories标志。但是,文档说明(强调我的):

  

这是一个咨询标志。如果文件系统支持目录过滤,则该函数将搜索与指定名称匹配的文件,并且也是目录。如果文件系统不支持目录过滤,则会以静默方式忽略此标志。

     

如果需要目录过滤,可以在所有文件系统上使用此标志,但由于它是一个顾问标志并且只影响支持它的文件系统,应用程序必须检查存储在lpFindFileData中的文件属性数据FindFirstFileEx函数的参数,用于确定函数是否已返回目录句柄

但是,据我所知,信息稀疏,桌面文件系统不支持FindExSearchLimitToDirectories标记。

最好的办法是FindFirstFileExFindExSearchLimitToDirectories一起使用。如果遇到不支持文件系统级别的目录过滤的文件系统,您仍必须执行自己的过滤。如果你很幸运并找到了支持它的文件系统,那么你将获得性能优势。