2009-07-14 66 views
3

我在C++中开玩笑。 有什么方法可以知道目录是否包含子目录?有没有什么方法可以知道目录是否包含子目录?

CFileFind似乎必须搜索整个文件。 如果唯一的子目录位于列表的末尾并且有很多文件,那么这很耗时。

例如:目录A包含99995个文件和一个在FindNextFile列表末尾的子目录。我试过99995次,然后说:是的,它包含子目录?

回答

0

这是否可以做得非常快,完全取决于平台。

在Win32上,您可以使用FindFirstFile/FindNextFile或MFC CFileFind之类的包装器,并且它们以某种顺序列出项目,但不能强制先列出目录。

+0

说,99995个文件和一个子目录蚂蚁结束FindNextFile列表。我试过99995次,然后说:是的,它包含子目录? – user25749 2009-07-14 06:50:43

+0

Yeap,这是在Win32上列出目录内容的唯一方法。这就是为什么在资源管理器中打开包含许多文件的文件夹需要很多时间。 – sharptooth 2009-07-14 06:53:00

1

如果您使用.Net框架,您可以使用Directory.GetDirectories,并检查数组的大小是否。不知道如果这会给你速度。

如果您可以控制目录,则可以应用命名约定,以便具有子目录的目录被命名为一种方式,而具有子目录的目录命名为另一个目录。

1

您可以尝试使用boost文件系统库。

一个名为directory_iterator的类[在boost/filesystem/operations.hpp中声明]有许多函数可用于列表文件,查找该文件是否是子目录(is_directory - 我想这就是你正在寻找)等。

请参阅以下链接了解更多信息。 link text

看来你正在使用MFC [刚才看到你使用的是CFileFind],之前没有看到。 对不起,没有太多的信息。您可能必须使用FindFirstFile/FindNextFile。

2

微软的Raymond Chen写了一篇文章,可能适用于:Computing the size of a directory is more than just adding file sizes。实际上,他解释说像dir的大小这样的信息不能存储在dir的条目中,因为不同的用户可能具有不同的权限,可能使某些文件对他们不可见。因此,获取用户应该看到的大小的唯一方法是根据用户的请求进行计算。

就你而言,答案可能源于相同的推理。应用程序可用的目录列表只有在您的应用程序请求时才能确定,因为其根目录的视图可能与另一个应用程序的视图不同,它们使用不同的凭据运行。为什么Windows将目录与我不知道的文件一起存储,但这是给定的。

由于Win32尽可能接近用户模式下的文件系统,因此我会避免使用.NET等更高级别的解决方案,因为它可能只会简化界面。司机可能会更快,但超出了我的知识范围。

相关问题