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 VariablendefinitionPULARGE_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.