2009-05-25 73 views
2

我想获得压缩磁盘上的可用空间,以显示给最终用户。我在Windows 2000及更高版本上使用C++,MFC。 Windows API提供GetDiskFreeSpaceEx()函数。GetDiskFreeSpaceEx与压缩磁盘

但是,该函数似乎会返回“未压缩”大小的数据。这会导致我一些问题。

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

用户将看到该盘是90%满,但在现实中,它只有80%满了。


编辑

由于格莱布指出,该函数返回的有用信息。

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

回答

1

我认为你将不得不对所有文件映射过来,用GetFileSize()GetCompressedFileSize(查询),总结起来。使用GetFileAttributes()知道文件是否被压缩,以防整个卷的一部分被压缩,这当然可能是这种情况。

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

是的。

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

您可能还想了解“更改日记帐”。我从来没有用过它们,所以不知道它们是如何工作的,但可能值得一试。

+0

嗡嗡声,所以这不是一个微不足道的操作。我想我必须实现一些机制来避免随时查询所有文件大小。 我的意思是......如果我有一个800GB的硬盘,可能需要很长时间才能获得所有文件大小。 – Nicolas 2009-05-25 14:11:49

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

压缩一个先前未压缩的目录后,可用空间增加。

那么你在说什么?