gpt4 book ai didi

c++ - 有效地列出目录中的所有子目录

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:28 24 4
gpt4 key购买 nike

请查看到目前为止采纳的建议的编辑...

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

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

这看起来效率极低,因为我正在查看目录中的每个文件。

  • 有没有我可以使用的 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 );
}

最佳答案

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

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

This is an advisory flag. If the file system supports directory filtering, the function searches for a file that matches the specified name and is also a directory. If the file system does not support directory filtering, this flag is silently ignored.

If directory filtering is desired, this flag can be used on all file systems, but because it is an advisory flag and only affects file systems that support it, the application must examine the file attribute data stored in the lpFindFileData parameter of the FindFirstFileEx function to determine whether the function has returned a handle to a directory.

但是,据我所知,而且信息很少,FindExSearchLimitToDirectories 标志在桌面文件系统上并未得到广泛支持。

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

关于c++ - 有效地列出目录中的所有子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7291797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com