我在c ++中学习。 有没有方法可以知道目录是否包含子目录?
CFileFind似乎必须搜索总文件。 如果唯一的子目录位于列表的末尾并且存在大量文件,则会非常耗时。
例如:目录A包含99995个文件和FindNextFile List末尾的一个子目录。我试过99995次,然后说:是的,它包含子目录?
答案 0 :(得分:2)
微软的Raymond Chen写了一篇可能适用于此的帖子:Computing the size of a directory is more than just adding file sizes。实质上,他解释说像dir的条目大小等信息不能存储在dir的条目中,因为不同的用户可能拥有不同的权限,可能会使某些文件对它们不可见。因此,获取用户应该看到的大小的唯一方法是根据用户的请求计算它。
在你的情况下,答案可能源于同样的推理。您的应用程序可用的目录列表只能在您的应用程序要求时确定,因为它的根目录视图可能与使用不同凭据运行的其他应用程序不同。为什么Windows存储目录以及我不知道的文件,但这是给定的。
由于Win32与用户模式下的文件系统一样接近,我会避免使用任何更高级别的解决方案,例如.NET,因为它可能只会简化界面。司机可能会更快地工作,但这超出了我的知识范围。
答案 1 :(得分:1)
如果您使用的是.Net框架,可以使用Directory.GetDirectories并检查数组的大小是否为0.不知道如何为您提供速度。
如果您可以控制目录,则可以应用命名约定,以便具有子目录的目录以一种方式命名,而具有out子目录的目录以另一种方式命名。
答案 2 :(得分:1)
您可以尝试使用boost文件系统库。
按名称分类的directory_iterator [在boost / filesystem / operations.hpp中声明]有许多函数可用于列出文件,查找文件是否是子目录(is_directory - 我想这就是你的意思寻找)等..
有关详细信息,请参阅以下链接。 link text
看来你正在使用MFC [刚看到你正在使用CFileFind],之前没有看到。 对不起,没有太多信息。您可能必须使用FindFirstFile / FindNextFile。
答案 3 :(得分:0)
这是否可以非常快地完成,完全取决于平台。
在Win32上,你使用FindFirstFile / FindNextFile或者像MFC CFileFind这样的包装器,它们按照某种顺序列出项目,不能强制首先列出目录。