请参阅目前为止的建议编辑…
我正在尝试使用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
标志在桌面文件系统中并没有被广泛支持。
您最好的选择是使用FindFirstFileEx
和FindExSearchLimitToDirectories
。如果遇到不支持文件系统级目录过滤的文件系统,您仍然必须执行自己的过滤。如果您幸运地找到一个支持它的文件系统,那么您将获得性能上的好处。
如果您正在使用FindFirstFileEx
,那么您应该能够指定_FINDEX_SEARCH_OPS::FindExSearchLimitToDirectories
选项(在FindFirstFileEx
中用作fSearchOp
参数)以限制对目录的第一次搜索(以及任何后续的FindNextFile()
)调用。