有效地列出目录中的所有子目录
Efficiently List All Sub-Directories in a Directory
请参阅目前为止的建议编辑…
我正在尝试使用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()
)调用。
- 有效地使用std::unordered_map来插入或增加键的值
- 如何有效地在 std::vector 中插入一对?
- 有效地计算多维数组的累积和?
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 有效地将大数存储为 2 的幂用于路径问题
- 如何在C++中写入 1000 个文件时有效地缓冲
- 如何有效地找到数组中三元组和的最小差异?
- 如何在C++中有效地将数字值重新分配给字符数组
- C++有效地找到向量中第一个最接近的匹配值?
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 有效地将数据加载到 std::vector 中<char>
- 如何在使用 cin 请求 int 时有效地使用户输入万无一失?
- C++:有效地将Sha256摘要放入OpenSSL Bignum?
- 如何有效地收集给定数组中的重复元素?
- 如何有效地修剪和合并四叉树中的节点?
- 可以有效地转换 std::any 与 std::any_cast
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 如何使用包含内部类的类实例有效地从内部类访问成员?
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 有效地列出目录中的所有子目录