请参阅编辑并提供迄今为止的建议......
我正在尝试使用WinAPI&列出给定目录中的所有目录(文件夹)。 C ++
现在我的算法很慢&低效:
- 使用FindFirstFileEx()打开我正在搜索的文件夹
- 然后我查看目录中的每个文件(使用FindNextFile());如果它是一个目录文件,那么我将其绝对路径存储在一个向量中,如果它只是一个文件我什么也不做。
这看起来非常低效,因为我正在查看目录中的每个文件。
修改 所以在接受了我使用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 );
}
答案 0 :(得分:1)
如果您使用的是FindFirstFileEx
,那么您应该可以指定_FINDEX_SEARCH_OPS::FindExSearchLimitToDirectories
选项(用作fSearchOp
中的FindFirstFileEx
参数)来限制第一次搜索(以及任何后续的FindNextFile()
)调用目录。
答案 1 :(得分:1)
为了提高性能,必须在文件系统级别提供支持。如果不存在,则系统必须枚举目录中的每个对象。
原则上,您可以使用FindFirstFileEx
指定FindExSearchLimitToDirectories
标志。但是,文档说明(强调我的):
这是一个咨询标志。如果文件系统支持目录过滤,则该函数将搜索与指定名称匹配的文件,并且也是目录。如果文件系统不支持目录过滤,则会以静默方式忽略此标志。
如果需要目录过滤,可以在所有文件系统上使用此标志,但由于它是一个顾问标志并且只影响支持它的文件系统,应用程序必须检查存储在lpFindFileData中的文件属性数据FindFirstFileEx函数的参数,用于确定函数是否已返回目录句柄。
但是,据我所知,信息稀疏,桌面文件系统不支持FindExSearchLimitToDirectories
标记。
最好的办法是FindFirstFileEx
与FindExSearchLimitToDirectories
一起使用。如果遇到不支持文件系统级别的目录过滤的文件系统,您仍必须执行自己的过滤。如果你很幸运并找到了支持它的文件系统,那么你将获得性能优势。