2009-05-25 15 views
2

Ich möchte den freien Speicherplatz auf einer komprimierten Festplatte abrufen, um es einem Endbenutzer anzuzeigen. Ich verwende C++, MFC unter Windows 2000 und höher. Die Windows-API bietet die GetDiskFreeSpaceEx()-Funktion.GetDiskFreeSpaceEx mit komprimierter Festplatte

Diese Funktion scheint jedoch die "unkomprimierte" Größe der Daten zurückzugeben. Das verursacht mir ein Problem.

Zum Beispiel: - Festplattengröße 100 GB - Datengröße 90 GB ist - Druckdatengröße 80 GB

Der Benutzer sieht, dass die Scheibe 90% voll ist, aber in Wirklichkeit ist es ist nur zu 80% voll.


EDIT

Wie Gleb wies darauf hin, ist die Funktion, die guten Informationen zurück.

Also hier ist die neue Frage: Gibt es eine Möglichkeit, sowohl die komprimierte Größe und die unkomprimierte zu bekommen?

Antwort

1

Ich glaube, Sie würden alle Dateien auf der Karte haben über, abfragen mit GetFileSize() und GetCompressedFileSize() und summieren sie. Verwenden Sie GetFileAttributes() zu wissen, ob eine Datei komprimiert ist oder nicht, für den Fall, dass nur Teile des gesamten Volumes komprimiert werden, was durchaus der Fall sein kann.

Hum, das ist also kein trivial Betrieb. Ich denke, ich muss einige Mechanismen implementieren, um zu vermeiden, alle Dateien die ganze Zeit abzufragen. Ich meine ... wenn Ich habe eine 800GB Festplatte, könnte es nehmen sehr lange Zeit, um alle Dateigröße zu bekommen.

Wahr.

Vielleicht starten Sie durch einen vollständigen Scan (Anwendungsstart) und füllen Sie Ihre benutzerdefinierte Datenstruktur, z. ein Hash/Map von Dateiname zu Datei Daten struct/class, dann das Laufwerk mit FindFirstChangeNotification() abfragen und aktualisieren Sie Ihre interne Struktur entsprechend.

Vielleicht möchten Sie auch über "Change Journals" lesen. Ich habe sie nie selbst benutzt, weiß also nicht, wie sie funktionieren, aber es könnte sich lohnen, sie auszuprobieren.

+0

Hum, das ist also keine triviale Operation. Ich vermute, ich muss einen Mechanismus implementieren, um zu vermeiden, dass alle Dateien die ganze Zeit abgefragt werden. Ich meine ... wenn ich eine 800GB Festplatte habe, könnte es sehr lange dauern, bis die Dateigröße erreicht ist. – Nicolas

+0

Ihrer Anmerkung wurde ein Kommentar hinzugefügt. Siehe meinen Beitrag. – ralphtheninja

1

Die Funktion gibt die Menge an freiem Speicherplatz korrekt zurück. Es kann mit diesem einfachen Programm demonstriert werden.

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

Nach einem zuvor unkomprimierten Verzeichnis Komprimieren des freie Speicherplatz wächst.

Worüber reden Sie?

Verwandte Themen