Von Datei benötigten Speicherplatz lesen



  • Hallo,

    weiß jemand wie man den von einer Datei benötigten Speicherplatz ausliest. Das ganze soll datei- und betriebssystemunabhänig und auch ohne Adminrechte funktioneren.



  • betriebssystemunabhänig heißt auf allen Windowsplatformen (zumindest neuere), oder auch andere?



  • WinAPI: FindFirstFile und GetCompressedFileSize



  • flenders schrieb:

    betriebssystemunabhänig heißt auf allen Windowsplatformen (zumindest neuere), oder auch andere?

    Das heißt auf allen Win9x-Systemen und unter allen NT-basierten. Es können von mir aus auch verschiedene Implementierungen sein - Hauptsache alle diese Implementierungen zusammen unterstützen dann alle Systeme.



  • Jochen Kalmbach schrieb:

    WinAPI: FindFirstFile und GetCompressedFileSize

    Mir ist nicht klar wie mir FindFirstFile hier helfen kann. GetCompressedFileSize ist sicherlich auch die falsche Funktion - zumindest wenn die Datei nicht komprimiert ist.



  • MSDN schrieb:

    The GetCompressedFileSize function retrieves the actual number of bytes of disk storage used to store a specified file.

    Hat nichts mit komprimieren alla zip oder rar zu tun.

    btw. das "Zuletzt bearbeitet von CMatt am 06 Apr 2006 00:22, insgesamt 3-mal bearbeitet" kommt daher weil ich aus versehen edit statt quote gedrückt habe.. hab am beitrag von Lefteous nichts geändet, sorry 😉



  • Achja, nocht was: GetCompressedFileSize gibts aber nur auf NT systemen auf win98 fällt mir da nur GetFileSize ein



  • CMatt schrieb:

    Hat nichts mit komprimieren alla zip oder rar zu tun.

    Naja es ist eben die Komprimierung, die mit NTFS genutzt werden kann. Für Dateien die auf diese Weise komprimiert wurden, scheint es auch die Größe zu sein, die auf dem Datenträger benutzt wird. Ich habe hier mal ein paar Dateigröße-modulo-clustergrößen-Rechnungen angestrengt und das Ergebnis war stets 0. Für nicht komprimierte Dateien ist es der selbe Wert wie für GetFileSize(Ex) und das ist nie und nimmer der benötigte Speicherplatz.

    Probier es einfach mal aus.



  • Was willst Du denn jetzt genau wissen?
    Der "benötigte Speicherplatz" ist sehr wage... zählst Du auch die EInträge in der MFT und dem Journal mit?
    Was willst Du bei Sparse-Files wissen, usw.?



  • Jochen Kalmbach schrieb:

    Was willst Du denn jetzt genau wissen?
    Der "benötigte Speicherplatz" ist sehr wage... zählst Du auch die EInträge in der MFT und dem Journal mit?
    Was willst Du bei Sparse-Files wissen, usw.?

    Nein so weit wollte ich nicht gehen, also ohne MFT und Journal. Es soll einfach nur die Dateigröße aufgerundet auf die Clustergröße des Volumes, auf dem sich die Datei befindet sein.
    Anders formuliert: Wenn ein Datenträger noch X1 freien Speicherplatz hat und eine nicht komprimierte Datei ohne alternate data streams mit der Größe Y gelöscht wird, so sei X2 der freie Speicherplatz nach dem Löschen der Datei. Der gesuchte Wert ist X1-X2. Das ist aber im Allgemeinen nicht Y!

    Bei sparse files liefert GetCompressedFileSize den gewünschten Wert.

    Nett wäre allerdings das optionale Mitzählen der Größe der alternate data streams. Das wäre aber wirklich nur ein Bonus. 🙂



  • Lefteous schrieb:

    Nein so weit wollte ich nicht gehen, also ohne MFT und Journal.

    äh, war es nicht so, daß auch die körper kleiner dateien in der MFT stehen?



  • volkard schrieb:

    Lefteous schrieb:

    Nein so weit wollte ich nicht gehen, also ohne MFT und Journal.

    äh, war es nicht so, daß auch die körper kleiner dateien in der MFT stehen?

    Unter NTFS werden bis zu ca. 512 bytes im File-Entry direkt reingeschrieben... somit belegen sozusagen kleine Dateien gar kein Speicherplatz, da dieser Speicherplatz eh für den Datei-Eintrag benötigt wird.



  • Eben also brauchen diese Dateien nach meiner Rechnung oben 0 bytes. 😉
    Die Rechnung Anzahl benötigte Cluster * Clustergröße ergibt in dem Fall nunmal 0.
    Auf der anderen Seite zeigt der Windows-Explorer im Eigenschaftsdialog unter "Größe auf Datenträger" 4KB (auf einem Datenträger mit 4KB Clustergröße) für solche kleinen Dateien an.

    Hat niemand eine Idee wie man an die gewünschten Daten (Anzahl benötigte Cluster und Clustergröße) kommt?



  • Lefteous schrieb:

    Eben also brauchen diese Dateien nach meiner Rechnung oben 0 bytes. 😉

    Sicherlicht nicht, da wenn Du die Datei löscht möglichweise 1 Cluster frei wird und somit mehr Speicher zur verfügung steht.

    Lefteous schrieb:

    Die Rechnung Anzahl benötigte Cluster * Clustergröße ergibt in dem Fall nunmal 0.

    Wie gesagt, das stimmt so nicht ganz...

    Lefteous schrieb:

    Hat niemand eine Idee wie man an die gewünschten Daten (Anzahl benötigte Cluster und Clustergröße) kommt?

    Wenn Du es ganz sicher bekommen willst, dann kannst Du die Schnittstelle zum Reorganisieren der Festplatte verwenden...
    http://msdn.microsoft.com/library/en-us/fileio/fs/fsctl_get_retrieval_pointers.asp
    http://www.sysinternals.com/Information/DiskDefragmenting.html



  • Jochen Kalmbach schrieb:

    Lefteous schrieb:

    Eben also brauchen diese Dateien nach meiner Rechnung oben 0 bytes. 😉

    Sicherlicht nicht, da wenn Du die Datei löscht möglichweise 1 Cluster frei wird und somit mehr Speicher zur verfügung steht.

    Wieso wenn vorher keiner belegt war wird auch keiner frei oder?

    Jochen Kalmbach schrieb:

    Lefteous schrieb:

    Hat niemand eine Idee wie man an die gewünschten Daten (Anzahl benötigte Cluster und Clustergröße) kommt?

    Wenn Du es ganz sicher bekommen willst, dann kannst Du die Schnittstelle zum Reorganisieren der Festplatte verwenden...
    http://msdn.microsoft.com/library/en-us/fileio/fs/fsctl_get_retrieval_pointers.asp
    http://www.sysinternals.com/Information/DiskDefragmenting.html

    Dankesehr da werde ich mal reinschauen.
    Hast Du auch eine Idee für Win 9x?


Log in to reply