带压缩磁盘的GetDiskFreeSpaceEx

时间:2009-05-25 13:02:22

标签: c++ windows winapi diskspace

我希望获得压缩磁盘上的可用空间,以便向最终用户显示。我在Windows 2000及更高版本上使用C ++,MFC。 Windows API提供GetDiskFreeSpaceEx()功能。

但是,此函数似乎返回“未压缩”大小的数据。这引起了我一些问题。

例如:   - 磁盘大小为100 GB   - 数据大小为90 GB   - 压缩数据大小为80 GB

用户将看到磁盘已满90%,但实际上只有80%已满。


修改

正如Gleb指出的那样,该功能正在返回好的信息。

所以这是一个新问题:有没有办法同时获得压缩大小和未压缩大小?

2 个答案:

答案 0 :(得分:1)

该函数正确返回可用空间量。这可以通过使用这个简单的程序来证明。

#include <stdio.h>
#include <windows.h>

void main() {
    ULARGE_INTEGER p1, p2, p3;
    GetDiskFreeSpaceEx(".", &p1, &p2, &p3);
    printf("%llu %llu %llu\n", p1, p2, p3);
}

压缩以前未压缩的目录后,可用空间会增加。

那你在说什么?

答案 1 :(得分:1)

我认为您必须映射所有文件,使用 GetFileSize() GetCompressedFileSize()查询并总结它们。使用 GetFileAttributes()来了解文件是否已压缩,以防仅压缩整个卷的某些部分,这可能就是这种情况。

  嗯,嗯,这不是一件小事   操作。我想我必须实施   一些避免查询所有的机制   文件大小始终。我的意思是......如果   我有一个800GB的硬盘,它可以   花了很长时间才能得到所有   文件大小。

真。

也许从全面扫描(应用程序启动)开始,然后填充自定义数据结构,例如:从文件名到文件数据结构/类的散列/映射,然后使用 FindFirstChangeNotification()轮询驱动器并相应地更新内部结构。

您可能还想阅读“更改日记”。我自己从未使用过它们,所以不知道它们是如何工作的,但可能值得一试。