2

我想获得压缩磁盘上的可用空间以将其展示给最终用户。我在 Windows 2000 及更高版本上使用 C++、MFC。Windows API 提供了该GetDiskFreeSpaceEx()功能。

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

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

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


编辑

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

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

4

2 回答 2

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);
}

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

那你在说什么?

于 2009-05-25T13:39:28.320 回答
1

我认为您必须映射所有文件,使用GetFileSize()GetCompressedFileSize()查询并总结它们。使用GetFileAttributes()来了解文件是否被压缩,以防整个卷只有部分被压缩,这肯定是这种情况。

嗯,所以这不是一个简单的操作。我想我必须实现一些机制来避免一直查询所有文件的大小。我的意思是……如果我有一个 800GB 的硬盘驱动器,可能需要很长时间才能获得所有文件大小。

真的。

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

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

于 2009-05-25T14:01:18.087 回答