【发布时间】:2014-09-27 21:53:41
【问题描述】:
我的程序需要获取所有子目录和子文件的目录大小,它通过递归枚举该目录中的所有对象并总结大小来实现。但是,对于大型目录,性能是不可接受的。它比 Windows 资源管理器目录属性计算的大小要长,并且它会导致硬盘驱动器更加嘎嘎作响。那么,我该如何优化这个过程呢?是否有任何合适的 WinAPI 函数或方法?
【问题讨论】:
-
据我所知,您的操作方式是“属性”对话框的操作方式。文件系统将缓存目录内容,因此如果您首先运行程序,属性对话框会看起来更快,因为数据已经在内存中。
-
@JonathanPotter:我知道其中涉及到一些缓存,并且我已经进行了足够多的实验以清楚地看到,即使 Properties 正在做同样的事情,它也是以一种更优化的方式来做的。而且我不确定如何优化它。
-
@PawełStawarz:这只有在您知道当前目录的基数至少比所有其他目录大一点的情况下才有效。而且我看不出这可以通过通用代码知道。如果您确实知道“我的分区专用于此目的,并且只包含这些目录”,您可以这样做,但对于通用功能,递归迭代目录是唯一的方法。
-
今天一个 TB 的驱动器需要一分钟多的时间来迭代。所以你的问题归结为“我如何告诉用户他想知道什么而不让他等待?”很简单:你向他展示你正在努力。用户不会感到惊讶。
-
对 FILE_ID_BOTH_DIR_INFO 使用 GetFileInformationByHandleEx 可能比使用 FindFirstFile 和 FindNextFile 更快。
标签: c++ windows winapi directory