GetDiskFreeSpaceEx mit Druckplatten
Frage
Ich mag den freien Speicherplatz auf einem komprimierten Datenträger, um es zu einem Endbenutzer zu zeigen. Ich bin mit C ++, MFC unter Windows 2000 und höher. Der Windows-API bietet die GetDiskFreeSpaceEx()
Funktion.
Allerdings ist diese Funktion scheint die „unkomprimiert“ Größe der Daten zurückzukehren. Dies verursacht mir ein Problem.
Zum Beispiel: - Festplattengröße 100 GB - Datengröße beträgt 90 GB - Druckdatengröße beträgt 80 GB
Der Benutzer sieht, dass die Platte 90% voll ist, aber in Wirklichkeit ist es nur 80% voll ist.
Bearbeiten
Wie Gleb wies darauf hin, ist die Funktion, die guten Informationen zurück.
Hier also ist die neue Frage: Gibt es eine Möglichkeit, sowohl die komprimierte Größe und die unkomprimierten eins zu bekommen
Lösung
Ich glaube, Sie würden alle Dateien auf der Karte haben über, Abfrage mit GetFileSize () und GetCompressedFileSize () und summieren sie. Mit GetFileAttributes () wissen, ob eine Datei komprimiert ist oder nicht, wenn nur Teile des gesamten Volumens komprimiert wird, was sicherlich der Fall sein könnte.
Hum, das ist also kein triviales Betrieb. Ich glaube, ich muss implementieren ein Mechanismus zu vermeiden, dass alle Abfragen Dateien Größe die ganze Zeit. Ich meine ... wenn Ich habe eine 800 GB Festplatte, könnte es nehmen einige sehr lange Zeit, um alle zu erhalten Dateigröße.
True.
starten Vielleicht durch einen Scan (Programmstart), und füllen Sie Ihre benutzerdefinierte Datenstruktur ab, z.B. eine Hash / Konvertierung von Dateinamendaten struct / class Datei, abfragen, dann das Laufwerk mit FindFirstChangeNotification () und dementsprechend Ihrer internen Struktur aktualisieren.
Sie können auch über „Change Journals“ lesen möchten. Ich habe sie nie benutzt mich so nicht wissen, wie sie funktionieren, könnte aber sein wert.
Andere Tipps
Die Funktion gibt die Menge an freiem Speicherplatz richtig. Es kann durch die Verwendung dieses einfache Programm gezeigt 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 der freie Speicherplatz wächst komprimiert wird.
Also, was redest du?