wie könnte ich das kürzen????



  • hi leute wie könnte ich dass kürzen dass ich nich Das ganze Alphabet hin schreiben muss und dann einen mörder quellcode habe??????

    // Laufwerk C:
            ULARGE_INTEGER TotalNumberOfFreeBytesC; 
            ULARGE_INTEGER TotalNumberOfBytesC;
    
            GetDiskFreeSpaceEx("C:",NULL,&TotalNumberOfBytesC,&TotalNumberOfFreeBytesC);
    
            if((int)Int64ShrlMod32(TotalNumberOfFreeBytesC.QuadPart,20)>0)
            {
    
            char RootPathNameA[256]="c:\\"; // address of name of root directory
            GetVolumeInformation(RootPathNameA,VolumeNameBuffer,255,
                               &VolumeSerialNumber,&MaximumComponentLength,
                               &FileSystemFlags,FileSystemNameBuffer,255 );
    
            DirPRO= (int)Int64ShrlMod32(TotalNumberOfBytesC.QuadPart,20)/100;
            DirFREIPRO=(int)Int64ShrlMod32(TotalNumberOfFreeBytesC.QuadPart,20)/DirPRO;
    
            sprintf(DirGESAMMT,"(Gesammt:) %iMB",Int64ShrlMod32(TotalNumberOfBytesC.QuadPart,20));// Gesammten speicher von C: in Readme.txt schreiben
    
            sprintf(DirFREI,"(Frei:) %iMB",Int64ShrlMod32(TotalNumberOfFreeBytesC.QuadPart,20));// Freien speicher von C: in Readme.txt schreiben
    
            out<<"\\n(C:) "<<VolumeNameBuffer<<" "<<DirGESAMMT<<" "<<DirFREI<<" -> "<<DirFREIPRO<<"% ("<<FileSystemNameBuffer<<") ";
    
            }
            else if((int)Int64ShrlMod32(TotalNumberOfFreeBytesC.QuadPart,20)<0){}
            else if((int)Int64ShrlMod32(TotalNumberOfFreeBytesC.QuadPart,20)==0)
            {
            out<<"\\n(C:) CD-Eingelegt";
            }
    
            // Laufwerk D:
            ULARGE_INTEGER TotalNumberOfFreeBytesD; 
            ULARGE_INTEGER TotalNumberOfBytesD;
    
            GetDiskFreeSpaceEx("D:",NULL,&TotalNumberOfBytesD,&TotalNumberOfFreeBytesD);
    
            if((int)Int64ShrlMod32(TotalNumberOfFreeBytesD.QuadPart,20)>0)
            {
    
            char RootPathNameA[256]="D:\\"; // address of name of root directory
            GetVolumeInformation(RootPathNameA,VolumeNameBuffer,255,
                               &VolumeSerialNumber,&MaximumComponentLength,
                               &FileSystemFlags,FileSystemNameBuffer,255 );
    
            DirPRO= (int)Int64ShrlMod32(TotalNumberOfBytesD.QuadPart,20)/100;
            DirFREIPRO=(int)Int64ShrlMod32(TotalNumberOfFreeBytesD.QuadPart,20)/DirPRO;
    
            sprintf(DirGESAMMT,"(Gesammt:) %iMB",Int64ShrlMod32(TotalNumberOfBytesD.QuadPart,20));// Gesammten speicher von D: in Readme.txt schreiben
    
            sprintf(DirFREI,"(Frei:) %iMB",Int64ShrlMod32(TotalNumberOfFreeBytesD.QuadPart,20));// Freien speicher von D: in Readme.txt schreiben
    
            out<<"\\n(D:) "<<VolumeNameBuffer<<" "<<DirGESAMMT<<" "<<DirFREI<<" -> "<<DirFREIPRO<<"% ("<<FileSystemNameBuffer<<") ";
    
            }
            else if((int)Int64ShrlMod32(TotalNumberOfFreeBytesD.QuadPart,20)<0){}
            else if((int)Int64ShrlMod32(TotalNumberOfFreeBytesD.QuadPart,20)==0)
            {
            out<<"\\n(D:) CD-Eingelegt";
            }
    


  • for(char drv='C';drv<='Z';++drv)
    {
    machdenrest(drv);
    }



  • Gerade dsass is ja das problem denn wenn ich

    for(char drv='A';drv<='Z';++drv)
    {
    

    kann ich nicht die laufwerksbuchstaben durchlaufen lassen wie sieht das bitte aus?
    Anhand dieses Beispiels bitte erklären:

    GetDiskFreeSpaceEx("D:",NULL,&TotalNumberOfBytesD,&TotalNumberOfFreeBytesD);
    


  • Anstatt

    char RootPathNameA[256]="c:\\"; // address of name of root directory
    

    nimm

    char RootPathNameA[256];
    sprintf(RootPathNameA, "%c:\\", drv);
    


  • warum geht das nich?????

    for(char drv='A';drv<='Z';++drv) {
    
    		//frür NTFS oder FAT bestimmung anfang
    		char VolumeNameBuffer[256];            // address of name of the volume
    		DWORD VolumeSerialNumber;              // address of volume serial number
    		DWORD MaximumComponentLength;          // address of system's maximum filename length
    		DWORD FileSystemFlags;                 // address of file system flags
    		char FileSystemNameBuffer[256];        // address of name of file system
    		UINT OldErrMode;
    		OldErrMode=SetErrorMode(SEM_FAILCRITICALERRORS);
    		//frür NTFS oder FAT bestimmung ende
    
    		// INITIALISIERUNGE FÜR GESAMMTSPEICHER + FREIER SPEICHER
    		char DirGESAMMT[500];
    		char DirFREI[500];
    		int DirFREIPRO;
    		int DirPRO;
    
    		ULARGE_INTEGER TotalNumberOfFreeBytes; 
    		ULARGE_INTEGER TotalNumberOfBytes;
    
    		char adr1[256]; //..
    		char adr2[256]; //..
    		sprintf(adr1,"%s:\\",drv);//..
    		sprintf(adr2,"%s:",drv); //..
    
    		GetDiskFreeSpaceEx(adr1,NULL,&TotalNumberOfBytes,&TotalNumberOfFreeBytes); //normal stünde hier statt adr1 - "C:\\"
    
    		if((int)Int64ShrlMod32(TotalNumberOfFreeBytes.QuadPart,20)>0)
    		{
    		GetVolumeInformation(adr2,VolumeNameBuffer,255,[b]//normal stünde hier statt adr2 - "C:"
                               &VolumeSerialNumber,&MaximumComponentLength,
                               &FileSystemFlags,FileSystemNameBuffer,255 );
    
    		}
    		else if((int)Int64ShrlMod32(TotalNumberOfFreeBytes.QuadPart,20)<0){}
    		else if((int)Int64ShrlMod32(TotalNumberOfFreeBytes.QuadPart,20)==0)
    		{
    
    		}
    
        }
    


  • %c nicht %s !!!



  • Funz trotzdem noch nich jetzt gibts mir total falsche werte aus denn die variablen übernehmen einen wert und wenn es das laufwerk nicht gibt behalten sie einfach den wert des vorherigen laufwerks wie krieg ich das in den griff?



  • if(GetDiskFreeSpaceEx(...))
    {
    // Laufwerk existiert
    }
    else
    {
    // Laufwerk existiert nicht
    }
    


  • ich glaub hier gibts ein missverständniss:

    1. ich überprüf obdie laufwerke vorhanden sind
    2. es schreibt mir ab dem 3ten laufwerk immer das selbe fürdie restlichen

    BSP:
    ||||||||||||||||||C|||| <- komische zeichen
    😨 2500MB Frei <- Hier funz
    E: 3500MB Frei <- Hier funz
    F: 3000MB Frei <- doch hier schreibts immer das selbe ob wohl es das Laufwerk gar nich mehr gibt

    ....
    Y: 3000MB Frei
    Z: 3000MB Frei

    CODE:

    for(char drv='A';drv<='Z';++drv) {
    
    		//frür NTFS oder FAT bestimmung anfang
    		char VolumeNameBuffer[256];            // address of name of the volume
    		DWORD VolumeSerialNumber;              // address of volume serial number
    		DWORD MaximumComponentLength;          // address of system's maximum filename length
    		DWORD FileSystemFlags;                 // address of file system flags
    		char FileSystemNameBuffer[256];        // address of name of file system
    		UINT OldErrMode;
    		OldErrMode=SetErrorMode(SEM_FAILCRITICALERRORS);
    		//frür NTFS oder FAT bestimmung ende
    
    		// INITIALISIERUNGE FÜR GESAMMTSPEICHER + FREIER SPEICHER
    		char DirGESAMMT[500];
    		char DirFREI[500];
    		int DirFREIPRO;
    		int DirPRO;
    
    		ULARGE_INTEGER TotalNumberOfFreeBytes; 
    		ULARGE_INTEGER TotalNumberOfBytes;
    
    		TotalNumberOfFreeBytes; 
    		TotalNumberOfBytes;
    
    		char adr1[3];
    		char adr2[3];
    
    		sprintf(adr1,"%c:\\",drv);
    		sprintf(adr2,"%c:",drv);
    
    		GetDiskFreeSpaceEx(adr1,NULL,&TotalNumberOfBytes,&TotalNumberOfFreeBytes);
    
    		if((int)Int64ShrlMod32(TotalNumberOfFreeBytes.QuadPart,20)>0)
    		{
    		GetVolumeInformation(adr2,VolumeNameBuffer,255,
                               &VolumeSerialNumber,&MaximumComponentLength,
                               &FileSystemFlags,FileSystemNameBuffer,255 );
    
    		DirPRO=	(int)Int64ShrlMod32(TotalNumberOfBytes.QuadPart,20)/100;
    		DirFREIPRO=(int)Int64ShrlMod32(TotalNumberOfFreeBytes.QuadPart,20)/DirPRO;
    
    		sprintf(DirGESAMMT,"(Gesammt:) %iMB",Int64ShrlMod32(TotalNumberOfBytes.QuadPart,20));// Gesammten speicher von C: in Readme.txt schreiben
    
    		sprintf(DirFREI,"(Frei:) %iMB",Int64ShrlMod32(TotalNumberOfFreeBytes.QuadPart,20));// Freien speicher von C: in Readme.txt schreiben
    
    		cout<<"\\n("<<drv<<":) "<<VolumeNameBuffer<<" "<<DirGESAMMT<<" "<<DirFREI<<" -> "<<DirFREIPRO<<"% ("<<FileSystemNameBuffer<<") \n";
    
    		}
    		else if((int)Int64ShrlMod32(TotalNumberOfFreeBytes.QuadPart,20)<0){}
    		else if((int)Int64ShrlMod32(TotalNumberOfFreeBytes.QuadPart,20)==0)
    		{
    		cout<<"\\n("<<drv<<":) CD-Eingelegt\n";
    		}
    
        }
    


  • In dem Teil, den du eben geschrieben hast, kann ich keine Prüfung erkennen.
    Du musst bei jedem Schleifendurchlauf prüfen, ob das Laufwerk existiert, sonst wird die Schleife für alle Laufwerke von A bis Z durchlaufen.
    Wenn ein Laufwerk nicht existiert, liefert GetDiskFreeSpaceEx einen Fehler, und die Daten werden nicht verändert. Da du hier aber gar nichts prüfst, werden die (unveränderten) Daten weiterhin ausgegeben für alle Laufwerke.



  • if(GetDiskFreeSpaceEx(adr1,NULL,&TotalNumberOfBytes,&TotalNumberOfFreeBytes)==NULL){}
    hab ich jetzt eingebaut trotzdem gibt es mir noch so komische zeichen zwischen den laufwerken an ,doch wie kann ich das prob beseitigen wennichden buffer kleiner mache kannes mir die datenträgererweiterung nich mehr anzeigen 😞
    und erstma danke mit dem tipp wegen der überprüfung das funz jetzt



  • Nein, es reicht nicht, es sei denn, du setzt vorher alle Werte auf definierte, ungültige Werte, so dass du später feststellen kannst, dass die Werte nicht von GetDiskFreeSpaceEx verändert wurden, und es sich anscheinend nicht um ein Laufwerk handelt.
    Aber wozu so umständlich? Das hab ich doch vorhin geschrieben!

    if(GetDiskFreeSpaceEx(...))
    {
    // Laufwerk existiert, Werte wurden gesetzt, Daten ausgeben
    }
    else
    {
    // Laufwerk existiert nicht, ignorieren
    }
    

    Wenn's das Laufwerk gibt, dann zeige dessen Informationen an, wenn nicht, dann ignoriere es einfach und mache nichts!
    Du kannst auch GetDriveType verwenden, um die Art des Laufwerks rauszufinden.
    /Edit: Mist, zu schnell 😉



  • da gibts nu ein klitze kleines problem :

    wenn ich so mache wie du es mir geschrieben hast

    if(GetDiskFreeSpaceEx(adr1,NULL,&TotalNumberOfBytes,&TotalNumberOfFreeBytes))
    

    steht auf meinem bildschirm:

    Die zeichen sind narlich gekürtzt sonst würde dass nicht ins board passen
    (E:) (Gesammt:) 30004MB (Frei:) 26862MB -> 89% (ÌÌÌÌÌÌEÌÌÌ”ÐF) 
    (G:) (Gesammt:) 117239MB (Frei:) 41248MB -> 35% (ÌÌÌÌÌÌGÌÌÌ”ÐF)
    (H:) (Gesammt:) 117239MB (Frei:) 41248MB -> 35% (ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌHÌÌÌ”ÐF)
    (I:) (Gesammt:) 117239MB (Frei:) 41248MB -> 35% (ÌÌÌÌÌÌÌÌÌÌÌÌÌIÌÌÌ”ÐF)
    ...
    (X:) (Gesammt:) 117239MB (Frei:) 41248MB -> 35% (ÌÌÌ”ÐF)
    (Y:) (Gesammt:) 117239MB (Frei:) 41248MB -> 35% (ÌÌÌÌÌÌYÌÌÌ”ÐF)
    (Z:) (Gesammt:) 117239MB (Frei:) 41248MB -> 35% (ÌÌÌÌÌÌÌÌZÌÌÌ”ÐF)
    

    mach ichs so:

    if(GetDiskFreeSpaceEx(adr1,NULL,&TotalNumberOfBytes,&TotalNumberOfFreeBytes) == NULL)
    

    steht auf meinem bildschirm:

    (C:) (Gesammt:) 8142MB (Frei:) 3375MB -> 41% (ÌÌÌÌÌÌCÌÌÌ”ÐF)
    (D:) (Gesammt:) 30004MB (Frei:) 26862MB -> 89% (NTFS)
    (F:) (Gesammt:) 117239MB (Frei:) 41248MB -> 35% (NTFS)
    

    und das würde sogarstimmen wenn die blöden zeichen nicht da wären!!



  • Das ist nun allerdings recht seltsam, denn

    http://msdn.microsoft.com/library/en-us/fileio/base/getdiskfreespaceex.asp schrieb:

    Return Values

    If the function succeeds, the return value is nonzero.

    If the function fails, the return value is zero. To get extended error information, call GetLastError.

    Das, was du beschreibst, ist genau das Gegenteil 😕
    Und bei der Abfrage der anderen Informationen solltest Du auch eine Fehlerabfrage einbauen, wer weiß, ob diese komischen Strings überhaupt von einer Funktion stammen...



  • ne schon klar mein fehler hab falsch aus meinem qc rauskopiert da geht noch ein stück ab

    if(GetDiskFreeSpaceEx(adr1,NULL,&TotalNumberOfBytes,&TotalNumberOfFreeBytes) == NULL)
    		{
    		}
    
    		else
    		{
                      //FUNZ 
                      }
    

    (edit) NE Passt schon durch die zeite prüfung funz THX


Anmelden zum Antworten