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 に答える