Problem beim ausgeben mit GetDiskFreeSpaceEx
-
Hi....
ich wollte mir ein Programm schreiben das mir die Festplattengrösse ausgibt.
Dazu hab ich hier vieles gefunden das ich verwenden konnte nur zeigt mir das Programm leider nicht den Gesamtspeicher an, bei freiem Speicher hindoch geht alles perfekt.Mein Code bis jetzt:
#include <stdio.h> #include <windows.h> int main(void) { char VolumeNameBuffer[50]; char FileSystemNameBuffer[20]; char type[20]; DWORD VolumeSerialNumber; DWORD MaximumComponentLength; DWORD FileSystemFlags; ULARGE_INTEGER TotalNumberOfFreeBytes; ULARGE_INTEGER TotalNumberOfBytes; for(char drive='A';drive<='Z';++drive) { char drive1[10]; sprintf(drive1,"%c:\\",drive); if (GetDriveType(drive1) == DRIVE_REMOVABLE) { printf (" %s Disketten- oder Wechseldatentraeger\n", drive1); } else if (GetDriveType(drive1) == DRIVE_CDROM) { printf (" %s CD-Laufwerk\n", drive1); } else { GetDiskFreeSpaceEx(drive1, NULL, &TotalNumberOfBytes, &TotalNumberOfFreeBytes); if (GetDriveType(drive1) == DRIVE_UNKNOWN) { sprintf(type,"%s (Unknown)", drive1); } else if (GetDriveType(drive1) == DRIVE_RAMDISK) { sprintf(type,"%s (Ramdisk)", drive1); } else if (GetDriveType(drive1) == DRIVE_REMOTE) { sprintf(type,"%s (Remote)", drive1); } else if (GetDriveType(drive1) == DRIVE_NO_ROOT_DIR) { sprintf(type,"%s (Mount)", drive1); } else if (GetDriveType(drive1) == DRIVE_FIXED) { sprintf(type,"%s (Festplatte)", drive1); } if (GetVolumeInformation(drive1, VolumeNameBuffer, 49, &VolumeSerialNumber, &MaximumComponentLength, &FileSystemFlags, FileSystemNameBuffer, 19)) { printf (" %s %s %s Frei: %d MB von %d MB\n", type, VolumeNameBuffer, FileSystemNameBuffer, TotalNumberOfFreeBytes.QuadPart/1024/1024, TotalNumberOfBytes.QuadPart/1024/1024); } } } printf (" "); }Wenn ich debuge und mir dann TotalNumberOfFreeBytes.QuadPart anschau, steht der richtige Wert drinnen nur bei der Ausgabe schreibt er dann wieder 0 hin !
Warum macht er das und warum funktioniert das bei TotalNumberOfFreeBytes
Auch wollte ich fragen ob ich irgendwie prüfen kann wann ich was in meinem "WECHSELDATENTRAEGER" -laufwerk gesteckt hab und wann nicht wenn nämlich nix drinnen steckt und ich versuch mit GetDiskFreeSpaceEx die grösse zu bestimmten stop mein Programm und es kommt das "Es befinden sich kein Datenträger in .." Fenster ?
Vielen Dank schon im voraus !
-
Was dir in deiner Sammlung noch fehlt, ist der
switch / caseBefehl

Außerdem muss man nicht jedesmal GetDriveType() aufrufen.
Stattdessen einmal in einer Var. speichern und die vergleichen.
(Oder wie gesagt switch verwenden)Zur Frage:
Ich denke, printf soll eine Integer ausgeben ("%d"), diese ist hier wohl 32Bit groß (und mit vorzeichen).
Du übergibst aber ein 64 Bit Integer, und diesen vorzeichenlos.Also verwende TotalNumberOfFreeBytes.LowPart und ändere im printf auf ("%u") um.
-
zu 2.) Willst du sowas: Detecting Media Insertion or Removal
-
Thx SeppSchrot funktioniert
auch dafür das du mich auf switch/case hingewiesen hast ich wusste das man das irgendwie schöner machen kann *g*Der link schaut gut aus flenders DANKE dafür ich werde mich morgen damit beschäftigen.
mfg
ToMjAcK
-
Ich hab das Problem jetzt anders gelöst:
printf (" %s %s %s Frei(%d%%): %I64d MB || Gesamt: %I64d MB\n", type, VolumeNameBuffer, FileSystemNameBuffer, prozent, TotalNumberOfFreeBytes.QuadPart/1024/1024, TotalNumberOfBytes.QuadPart/1024/1024);Leider hab ich eine (Remote) Festplatte im Rechner dessen Gesamtspeicher 48 MB betraeg und freier Speicher ca. 6 MB.
Jedesmal wenn er zur der Festplatte kommt schreibt er in TotalNumberOfFreeBytes einen mir unerklärlich grossen Wert der nicht annähern stimmt rein?
TotalNumberOfByte hingegen stimmt.