GetDiskFreeSpaceEx gibt mir falschen Wert zurück



  • Hallo zusammen,

    ich hätte noch mal eure Hilfe nötig.

    Im Vorlauf eines Installers auf AutoIt-Basis prüfe ich auf verschiedene, systemrelevante Dinge, deren Ergebnisse ich dann in einer TXT-Datei speichere, um sie dann für den Installer einzulesen und weiter zu verarbeiten... unter Anderem eben auch den Speicherplatz auf der SD-Karte.

    Bei kleineren SD-Karten <= 4GB ist die Ausgabe in meine TXT korrekt.

    Sobald ich aber eine 8GB SDHC einstecke, bekomme ich eine falsche Ausgabe, immer mit einem Minus-Zeichen davor, z.B: -113180672, obwohl lt. Explorer 4.182.310.912 Bytes frei sind. Habt Ihr ne Idee warum? 😞

    Könnte es an SDHC liegen, statt SD?

    Hier ist der Abschnitt aus dem \1:

    ///// Speicherplatz auf der SD frei
    			PULARGE_INTEGER freespace = 0;
    			wchar_t hStr5[100];
    			GetDiskFreeSpaceEx(L"\\Storage Card\\" , NULL, NULL, (PULARGE_INTEGER)&freespace);
    			swprintf(hStr5, L"%d", freespace);
    				wcscat(variable, hStr5);
    			wcscat(variable, L"|");
    


  • Versuch mal statt bisher

    swprintf(hStr5, L"%d", freespace);
    

    mal so:

    swprintf(hStr5, L"%I64d", freespace);
    

    HTH,
    Martin



  • Hallo Martin,

    jep das wars... Merci! 👍



  • PULARGE_INTEGER freespace = 0; 
                wchar_t hStr5[100]; 
                GetDiskFreeSpaceEx(L"\\Storage Card\\" , NULL, NULL, (PULARGE_INTEGER)&freespace); 
                swprintf(hStr5, L"%d", freespace);
    

    das ist sowie falsch, auch noch mit "%I64d"
    ->

    ULARGE_INTEGER freespace = {}; 
    	wchar_t hStr5[100]; 
    	GetDiskFreeSpaceEx(L"\\Storage Card\\" , NULL, NULL, &freespace); 
    	swprintf(hStr5, L"%I64d", freespace.QuadPart);
    

    und wie man sieht: wenn man es richtig macht, braucht man auch keinen cast mehr.



  • Hallo hustbaer,

    wieso ist das falsch?
    Jetzt wird mir jedenfalls der richtige Wert in die TXT geschrieben...

    Dein Code rennt bei mir jedenfalls in Fehler... 😕



  • Freut mich Dir geholfen zu haben.
    Dein Programm scheint zu laufen.

    Trotzdem muß ich hustbaer recht geben, er hat einen zweiten Fehler entdeckt 🕶
    Denn mit der Variablendefinition

    PULARGE_INTEGER freespace = 0;
    

    hast Du nur den Pointer definiert, nicht den Speicherbereich für freespace selbst, welcher 8 Bytes beanspruchen würde.
    D.h. GetDiskFreeSpaceEx() trägt die Informationen irgendwo ein, wohin freespace als Pointer hinzeigt. Und dort ist kein reservierter, sondern zufälliger Speicherplatz! 😮

    Hinweis: Die ungarische Notation von Microsoft besagt, daß das "P" in PULARGE_INTEGER für ein Pointer steht.

    Also korrekt muß es so aussehen:

    ULARGE_INTEGER freespace;
    

    und damit auch korrekt so:

    GetDiskFreeSpaceEx(L"\\Storage Card\\" , NULL, NULL, &freespace);
    

    HTH,
    Martin



  • Ahhh...

    danke Martin, jetzt hab ich das verstanden... 💡

    So ist das mit Anfängern... Ich wurschtel mich da so langsam ein, neben den anderen "Baustellen" mit AutoIt usw... 🤡

    Hab vor X-Jahren mit nem Oric 1 angefangen, aber viele Jahre nichts mehr ausser ein wenig in VBA. Da ist es für mich relativ schwer den Einstieg hinzubekommen...

    Aber gut, dass es Euch gibt! 👍

    ///// Speicherplatz auf der SD frei
    			ULARGE_INTEGER freespace;
    			wchar_t hStr5[200];
    			GetDiskFreeSpaceEx(L"\\Storage Card\\" , NULL, NULL, &freespace);
    			swprintf(hStr5, L"%I64d", freespace.QuadPart);
    			wcscat(variable, hStr5);
    


  • Pitter (c) schrieb:

    Hallo hustbaer,

    wieso ist das falsch?
    Jetzt wird mir jedenfalls der richtige Wert in die TXT geschrieben...

    Dein Code rennt bei mir jedenfalls in Fehler... 😕

    Was für Fehler?
    Ein paar Compiler stossen sich an den leeren {} die ich zur Initialisierung verwende. Die Initialisierung, die streng genommen unnötig ist, und die du weggelassen hast.
    Kann man aber auch einfach als {0} schreiben, dann frisst es z.B. auch VC6, der die leeren {} als Fehler bemängelt.
    (Ich glaube die leeren {} sind vom Standard her erlaubt, aber sicher bin ich mir nicht. VC 2005 frisst auf jeden Fall auch die leeren {})

    Sonst sehe ich da nix was Probleme machen dürfte.



  • Hallo hustbaer,

    jep genau die leeren {} waren das Problem. Pelles C stört sich auch daran.

    Allerdings bin ich nicht auf die Idee gekommen, die einfach weg zu lassen, als ich das getestet hab. Aber Dein Tipp war schon goldrichtig, hätte Pelles C da nicht gemeckert.


Anmelden zum Antworten