我在 C++ 中醒来。有什么方法可以知道一个目录是否包含子目录?
CFileFind 似乎必须搜索全部文件。如果唯一的子目录位于列表的末尾并且有很多文件,则非常耗时。
例如:目录 A 包含 99995 个文件和 FindNextFile 列表末尾的一个子目录。我尝试了 99995 次,然后说:是的,它包含子目录?
我在 C++ 中醒来。有什么方法可以知道一个目录是否包含子目录?
CFileFind 似乎必须搜索全部文件。如果唯一的子目录位于列表的末尾并且有很多文件,则非常耗时。
例如:目录 A 包含 99995 个文件和 FindNextFile 列表末尾的一个子目录。我尝试了 99995 次,然后说:是的,它包含子目录?
来自 Microsoft 的 Raymond Chen 写了一篇可能适用于此的帖子:计算目录的大小不仅仅是添加文件大小。本质上,他解释说像目录大小这样的信息不能存储在目录的条目中,因为不同的用户可能有不同的权限,可能会使某些文件对他们不可见。因此,获得用户应该看到的大小的唯一方法是根据用户的请求计算它。
在您的情况下,答案可能源于相同的推理。您的应用程序可用的目录列表只能在您的应用程序请求时确定,因为它的根目录视图可能与另一个应用程序的不同,使用不同的凭据运行。为什么 Windows 将目录与我不知道的文件一起存储,但这是给定的。
由于 Win32 与用户模式下的文件系统非常接近,因此我会避免使用任何更高级别的解决方案,例如 .NET,因为它可能只会简化界面。司机可能工作得更快,但这超出了我的知识范围。
如果您使用的是 .Net 框架,您可以使用Directory.GetDirectories并检查数组的大小是否为 0。不知道这是否会给您带来速度。
如果您可以控制目录,则可以应用命名约定,以便具有子目录的目录以一种方式命名,而没有子目录的目录则以另一种方式命名。
您可以尝试使用 boost 文件系统库。
一个名为 directory_iterator [在 boost/filesystem/operations.hpp 中声明] 的类具有许多可用于列出文件的函数,查找文件是否为子目录( is_directory - 我猜这就是您要查找的内容) ETC..
有关更多信息,请参阅以下链接。 链接文本
看来您正在使用 MFC [刚刚看到您正在使用 CFileFind ],之前没有看到。抱歉,没有太多信息。您可能必须使用 FindFirstFile/FindNextFile。
这是否可以非常快地完成完全取决于平台。
在 Win32 上,您使用 FindFirstFile/FindNextFile 或 MFC CFileFind 之类的包装器,它们以某种顺序列出项目,不能强制首先列出目录。