2009-05-25 71 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); 
} 

壓縮一個先前未壓縮的目錄後,可用空間增加。

那麼你在說什麼?