Speicherverbrauch einer Datei
-
Servus Community,
ich habe hier schon ein Thread angefangen. Es geht darum, dass ich den Speicherverbrauch einer Datei herausfinden will und es hat sich in diesem Thread schon ergeben, dass die Größe der Datei sich von dem wirklichen Verbrauch unterscheidet. nman hat mir du(Disk Usage) angeboten. Das Problem ist, dass mir dieses Programm zwar perfekt den Speicherverbrauch eines gewissen Pfades angeben würde, ich aber bei jeder Datei immer bestimmte Anweisungen ausführen muss. Ich muss also nicht nur wissen wieviel Speicher verbraucht wird, sondern ich muss noch gewisse andere Daten der Dateien ablegen. Ich bräuchte also eine Funktion, die mir wie das Programm, den Speicherverbrauch einer Datei angibt. Ich würde ungern in meinem Programm Disk Usage immer wieder für eine einzelne Datei aufrufen, dass würde zu lange dauern. Über Google habe ich nichts brauchbares gefunden. Gibt es zufällig eine WinApi Funktion für sowas, oder eine Bibliothek die sowas übernimmt?
Ich benutze C#.Mit freundlichen Grüßen,
Freaky
-
Ich glaube du suchst das hier: http://stackoverflow.com/questions/3750590/c-sharp-get-file-size-on-disk
-
Ja, danke. Die Funktion gibt mir den tatsächlichen Verbrauch auf der Platte an. Das Problem ist jetzt nur, dass ich mein Programm vorher schon 1GB zuviel im gegensatz zu Windows berechnet hat. Jetzt bin ich bei 12GB, denn wenn eine Datei, wie einem vorherigen Post schon beschrieben, beispielsweiße 700Bytes groß ist, verbrauch die Datei auf der Platte 4KB. Hat vielleicht jemand einen Vorschlag?
-
Platzverbrauch einer Datei ist alles andere als trivial.
Willst du auf den Wert kommen den Windows' Explorer im "Properties" Dialog anzeigt, oder willst du eine halbwegs realistische Abschätzung haben?
Falls ersteres: keine Ahnung, da müsstest du genau rausbekommen was der Explorer macht. Vermutlich ist die Rechnung ziemlich einfach und ziemlich doof. Der Wert der da angezeigt wird ist nämlich auch nicht sehr realistisch, Explorer zeit z.B. bei einer 4 Byte Datei als Platzverbrauch 1 Cluster an. Was laut Info die man so im Netz findet halt nicht stimmt, weil NTFS den Inhalt von sehr kleinen Files direkt im "stream descriptor" mit abspeichert, und der hat soweit ich weiss 1 KB, unabhängig von der Clustergrösse.Und eine Datei die wirklich knapp oder genau 4 KB hat braucht halt auch nicht 4 KB sondern min. 5.
Siehe
http://en.wikipedia.org/wiki/NTFS#Resident_vs._non-resident_data_streams----
Zum "Platzverbrauch" einer Datei unter NTFS gehören (kein Abspruch auf Vollständigkeit):
* Der $MFT Eintrag selbst (1KB pro File)
* Wenn der "security descriptor" zu gross wird wird dieser aus dem $MFT Eintrag ausgelagert, und braucht dann auch extra Platz
* Bei stark fragmentierten Files wird die Extent-Liste ausgelagert, und braucht dann extra Platz
* Einträge in diversen Index-Files wie z.B. $Secure
* Die eigentlichen Datenstreams, sofern sie nicht mit im $MFT Eintrag abgespeichert werden