GetDiskFreeSpaceEx liefert falschen Wert, oder doch nicht?


  • Mod

    Wahrscheinlich berücksichtigt Du nicht die versteckten Dateien.
    Auf den Ordner "System Volume Information" in dem einige Informationen für die Systemwiederherstellung stecken hast Du keinen Zugriff.

    Auch ein komplettes Durcharbeiten aller Dateien würde Dir die Dateien in diesem Verzeichnis nicht liefern.


  • Mod

    BTW: Es gibt einen einfachn Trick ohne die Rechte zu verändern in dieses Verzeichnis auf der Befehlszeilen Ebene hineinzusehen:

    AT hh:mm /INTERACTIVE cmd.exe

    hh:mm naheliegend wählen.

    Man bekommt eine Sesion die im Lokalsystem Account läuft.

    Bei mir sind 13GB in diesem Systemwiederhestellungsbereich.


  • Administrator

    @Luckie, C: ist logischerweise NTFS und 😨 habe ich auch als NTFS gewählt, da es meine Datendisk ist und ich grössere Dateien als 4GB verwalten möchte 😉

    @Martin Richter,
    Oha, danke! Hab mich schon gefragt, was das soll. Aber 9GB System Wiederherstellung oder bei dir 13GB? Das ist ja krank viel.

    Naja, egal, was mich jetzt noch interessieren würde ist, wie ich eben zu den Anzahl Bytes kommen kann, die auf meiner Festplatte sind und auf die ich zugreifen kann? Und zwar eben wenn möglich ohne die ganze Festplatte durchzurattern, denn das mache ich danach und ich möchte irgendwie anzeigen, wie weit der Prozess halt schon ist *g*
    Gäbe es vielleicht eine Möglichkeit rauszufinden, wieviel Bytes die System Wiederherstellung verbraucht? Dann könnte man eine nette Minusrechnung machen ^^

    Grüssli


  • Mod

    Du kannst die Kapazität einstellen was verwendet werden soll.
    Sie System-Einstellungen.
    Bei mir ist Maximum 12% eingestellt. Main Raid System hat 160GB also ist das maximum bei mir 18GB!

    Edit: (War zu schnell)
    IMHO kann man das nicht so ohne weiteres errechnen. Das OS fragt dazu den Service ab für diese Info. Du selbst hast ja keinen Zugriff auf das Verzeichnis.

    Grundsätzlich musst Du Dir klar sein, dass Du die ganze festplatte niemals durchsuchen kannst. Evtl. hast Du gar ja eben gar keine Rechte dazu!


  • Administrator

    Martin Richter schrieb:

    Du kannst die Kapazität einstellen was verwendet werden soll.
    Sie System-Einstellungen.
    Bei mir ist Maximum 12% eingestellt. Main Raid System hat 160GB also ist das maximum bei mir 18GB!

    Habe ich inzwischen gefunden. Mal schauen ob ich das etwas verringern werde oder zumindest behalte ich es im Hinterkopf, falls der Platz einmal etwas knapp werden sollte.

    Martin Richter schrieb:

    IMHO kann man das nicht so ohne weiteres errechnen. Das OS fragt dazu den Service ab für diese Info. Du selbst hast ja keinen Zugriff auf das Verzeichnis.

    Grundsätzlich musst Du Dir klar sein, dass Du die ganze festplatte niemals durchsuchen kannst. Evtl. hast Du gar ja eben gar keine Rechte dazu!

    Das kann sein und ist in meinem Code eigentlich bereits berücksichtigt. Zudem hat man ja bei GetDiskFreeSpaceEx die folgenden Parameter:

    MSDN schrieb:

    lpFreeBytesAvailable
    [out] A pointer to a variable that receives the total number of free bytes on a disk that are available to the user who is associated with the calling thread.
    This parameter can be NULL.

    Windows Me/98/95: This parameter cannot be NULL.
    If per-user quotas are being used, this value may be less than the total number of free bytes on a disk.

    lpTotalNumberOfBytes
    [out] A pointer to a variable that receives the total number of bytes on a disk that are available to the user who is associated with the calling thread.
    This parameter can be NULL.

    Windows Me/98/95: This parameter cannot be NULL.
    If per-user quotas are being used, this value may be less than the total number of bytes on a disk.

    Eigentlich sollte es daher möglich sein nur die Menge an Bytes zu bekommen, welche auch von einem selber abrufbar sind. Oder verstehe ich da was falsch?

    Allerdings wird beim TotalNumberOfBytes leider immer auch das System Volume Information mit reingezogen, was doch eigentlich bei der Beschreibung nicht passieren sollte.
    Es muss doch irgendeinen Weg geben ... oder gibt es alternative Lösungen für mein Problem? ^^

    Grüssli



  • Du vermischt hier 2 verschiedene Dinge.

    GetDiskFreeSpaceEx fragt direkt das Filesystem, und das beantwortet die Frage einfach mit der Anzahl der freien Blöcke und der Gesamtanzahl an blöcken auf einem Volume. Berechtigungen spielen dabei keine Rolle. Sehrwohl spielen da aber andere Dinge mit rein wie z.B. der MFT, diverse Indexe etc., alles Strukturen die auch Speicher brauchen aber nicht als Dateien sichtbar sind.

    Eigentlich sollte es daher möglich sein nur die Menge an Bytes zu bekommen, welche auch von einem selber abrufbar sind.

    Was verstehst du unter "abrufbar"?


  • Administrator

    hustbaer schrieb:

    Du vermischt hier 2 verschiedene Dinge.

    Anscheinend ^^

    hustbaer schrieb:

    GetDiskFreeSpaceEx fragt direkt das Filesystem, und das beantwortet die Frage einfach mit der Anzahl der freien Blöcke und der Gesamtanzahl an blöcken auf einem Volume. Berechtigungen spielen dabei keine Rolle. Sehrwohl spielen da aber andere Dinge mit rein wie z.B. der MFT, diverse Indexe etc., alles Strukturen die auch Speicher brauchen aber nicht als Dateien sichtbar sind.

    Berechtigungen spielen keine Rolle?
    Und wie erklärst du mir das folgende dann?

    MSDN schrieb:

    the total number of free bytes on a disk that are available to the user who is associated with the calling thread

    Wobei es noch einen dritten Parameter hat, der die Anzahl der freien Bytes unabhängig vom User bekommt. Wobei ist denn da der Unterschied? Was ist mit user dann gemeint? Vor allem weil beide Parameter mir als Admin die gleiche Menge zurückliefern.

    hustbaer schrieb:

    Eigentlich sollte es daher möglich sein nur die Menge an Bytes zu bekommen, welche auch von einem selber abrufbar sind.

    Was verstehst du unter "abrufbar"?

    Berechtigung es abzurufen, bzw. zu lesen oder wie auch immer ^^

    Aber meine Frage bleibt, wie könnte ich sinnvoll herausfinden, zu wie vielen belegten/genutzten Bytes ich mit meinen Rechten Zugang habe?

    Grüssli


  • Mod

    Noch nie was von Disk-Quotas gehört?
    Unsere Serverplatten haben solche Quotas, das nicht jeder User sinnlos mit dem Platz umgeht!


  • Administrator

    Martin Richter schrieb:

    Noch nie was von Disk-Quotas gehört?
    Unsere Serverplatten haben solche Quotas, das nicht jeder User sinnlos mit dem Platz umgeht!

    Ehm ... nein ^^
    Interessant, was ich in diesem Thread alles über XP lerne 😃

    Aber meine Frage *zwängelt* 😃 😉

    Grüssli



  • Aber meine Frage bleibt, wie könnte ich sinnvoll herausfinden, zu wie vielen belegten/genutzten Bytes ich mit meinen Rechten Zugang habe?

    Die freien Bytes sollten kein Problem sein, die bekommst du eh von GetDiskFreeSpaceEx.

    Die belegten... wieso zum Geier willst du das wissen? Verstehe ich nicht...
    Eine "sags mir einfach" Funktion gibts da aber ganz sicher nicht, d.h. wenn du das wirklich unbedingt wissen musst, dann musst du eben das ganze Volume durchscannen, und Bytes zählen.


  • Administrator

    hustbaer schrieb:

    Die belegten... wieso zum Geier willst du das wissen? Verstehe ich nicht...
    Eine "sags mir einfach" Funktion gibts da aber ganz sicher nicht, d.h. wenn du das wirklich unbedingt wissen musst, dann musst du eben das ganze Volume durchscannen, und Bytes zählen.

    Mist, denn genau das mache ich danach. Ich rattere durch die ganze Festplatte und baue währenddessen eine Strutkur auf. Es wäre daher schön, wenn ich die Bytes bereits zu Beginn weiss, dann kann ich in Prozent angeben, wie weit die Initialisierung bereits ist 😉

    Grüssli



  • Aaaaaaah.
    Naja, in dem Fall würde ich einfach das nehmen was GetDiskFreeSpaceEx zurückliefert. Das wird dann zwar je nach Volume mehr oder weniger daneben sein (kann komplett daneben sein wenns mit nem Userkonto läuft welches fast keine Rechte auf irgendwelche Dateien hat), aber das sollte egal sein.

    Wenn du dann noch die Anzahl der gefundenen Dateien und Verzeichnisse mit ausgibst sollte das reichen.
    Andere Programme machen das auch nicht anders.


  • Administrator

    hustbaer schrieb:

    Wenn du dann noch die Anzahl der gefundenen Dateien und Verzeichnisse mit ausgibst sollte das reichen.

    Ja das mache ich. Und jetzt habe ich es halt einfach noch so hingeschmuggelt, dass wenn die Funktion fertig ist, die Anzeige automatisch auf 100% springt. Nicht sehr sauber, aber naja, die Anzeige springt sowieso, wenn grosse Dateien gefunden werden ^^

    hustbaer schrieb:

    Andere Programme machen das auch nicht anders.

    Das ist keine Entschuldigung für eine schlechte Lösung 😉

    Edit: Was bin ich eigentlich unhöflich, wie kann ich sowas vergessen:
    Vielen Dank für die ganze Hilfe! ^^'

    Grüssli



  • Ich finde es ist keine schlechte Lösung. Eine schlechte Lösung wäre garnix anzuzeigen (also auch keinen Dateien/Verzeichnisse Counter - z.B. nur "working..."), oder aber erst die ganze Platte zu scannen um dann zu wissen wie lange das scannen der Platte dauern wird 😃

    Wenn du ohne die % Angabe auskommen kannst dann lass sie gleich ganz weg, das wäre auch OK.

    BTW: wenn du nur Verzeichniseinträge durchgehst dann wäre es wohl wirklich besser die % Anzeige ganz wegzulassen, denn du kannst ja wirklich nicht wissen ob du gleich noch 2 riesen Dateien mit den restlichen 1000MB findest, oder eine Million kleine Dateien.


  • Administrator

    hustbaer schrieb:

    Ich finde es ist keine schlechte Lösung. Eine schlechte Lösung wäre garnix anzuzeigen (also auch keinen Dateien/Verzeichnisse Counter - z.B. nur "working..."), oder aber erst die ganze Platte zu scannen um dann zu wissen wie lange das scannen der Platte dauern wird 😃

    Es gibt immer noch schlechtere Lösungen 😃
    Das ist aber auch keine Entschuldigung! 😉

    hustbaer schrieb:

    BTW: wenn du nur Verzeichniseinträge durchgehst dann wäre es wohl wirklich besser die % Anzeige ganz wegzulassen, denn du kannst ja wirklich nicht wissen ob du gleich noch 2 riesen Dateien mit den restlichen 1000MB findest, oder eine Million kleine Dateien.

    Ich gehe die ganze Festplatte durch, wo ich überall nur hinkomme. Dabei zeige ich dann auch die Bytes an, welche bereits initialisiert worden sind, von wievielen Bytes noch übrig sind. Zum Beispiel zum Zeitpunkt t:
    12'316'879'206 bytes from 41'654'315'983 bytes initiated (15'453 files, 1'565 folders) ... 30%

    Da springt es so oder so schon und der geschickte Beobachter wird erkennen, dass dies wegen grossen Dateien passiert. Die Anzeige wird alle 100ms aktualisiert und die Daten werden immer nach dem Durchsuchen eines Ordners auf den neusten Stand gesetzt.

    Aber wenn ich so überlege, dass das Programm sowieso wohl nur für meinen eigenen Privatgebrauch gebaut wird und wohl nie veröffentlicht wird, ist das ja sowieso egal und es geht nur um meine Bedürfnisse zu befriedigen 😉

    Grüssli


Anmelden zum Antworten