Ordner durchsuchen und .jpg Groesse feststellen



  • Hallo liebe CPPler!

    Ich bin gerade dabei ein Programm zu schreiben, das einen Ordner nach allen .jpg absuchen soll (da ich die Namen der .jpg's nicht weiß) und danach die Größe von allen .jpg feststellen soll.
    Wenn die Größe von einem oder mehreren .jpg's (in Bytes) nicht "41020" sind, wird auf der Konsole ein "Error" angezeigt.

    Den Code um die Größe rauszukriegen habe ich schon, wie 'durchsuche/checke' ich jetzt einen Ordner nach den .jpg's?

    Zudem kann ich bei meinem Größencode nicht mit 'if (groesse == "41020")' checken.
    Da bräuchte ich ebenfalls Hilfe.

    Mein Groessencode:

    {
    size_t fsize = ifstream("ALE32716716TH12FA40EIA.jpg").seekg(0, ios_base::end).tellg();
    cout << fsize << " Bytes" << endl;
    }
    

    (Ich habe gelesen das wäre die einfachste Methode um die Bytezahl rauszukriegen)

    Danke schonmal im vorraus!

    MfG Johnny Z.



  • Hi
    zuerstmal lass die Anführungszeichen bei deinem Größenvergleich weg:

    if (groesse == 41020)
    

    sonst machst du daraus eine Zeichenkette, und diese lässt sich nicht mit einem numerischen Wert vergleichen.

    Was die Suche angeht, wären wohl FindFirstFile() und FindNextFile deine Freunde:

    HANDLE          hSearch;
    WIN32_FIND_DATA fData;
    
    if (hSearch = FindFirstFile("*.jpg",&fData)) {
          do {
             std::cout << fData.cFileName << std::endl;
          } while (FindNextFile(hSearch,&fData));
          FindClose(hSearch);
       }
    


  • Danke erstmal für deine Antwort!

    Mein Code sieht zurzeit so aus:

    using namespace std;
    
    HANDLE hSearch;
    WIN32_FIND_DATA fData;
    
    int main()
    {
    if (hSearch = FindFirstFile("*.jpg",&fData))
    {
          do
          {
    	size_t fsize = ifstream(fData.cFileName).seekg(0, ios_base::end).tellg();
    	if (fsize == 41020)
    	{
    	cout<<"okay!";
    	}
    	else
    	{
    	cout<<"Error!";
    	}
          }
          while (FindNextFile(hSearch,&fData));
          FindClose(hSearch);
       }
    return 0;
    }
    

    Ich kriege aber Errors, was daran ist falsch?

    Errors sind folgende:

    error C2228: left of '.seekg' must have class/struct/union type
    error C2228: left of '.tellg' must have class/struct/union type



  • #include <fstream>
    

    vielleicht vergessen?



  • Jap danke.. Dachte es liegt vllt. daran wie er das du ifstream übergibt.
    Aber lag nur an dem kleinen Fehler. Danke dir! 😉



  • Wenn ich nun einen Ordner nach den .jpg durchsuchen möchte, klappt das nicht, nur warum nicht?

    if (hSearch = FindFirstFile("ORDNER\\*.jpg",&fData))
    

    Kann mir da evtl. jemand helfen?



  • wahrscheinlich wird deine Pfadangabe ungültig sein. Bedenke, dass dein Programm ein akteulles Verzeichniss hat in dem es werkelt. Pfadangaben wie dein Beispiel sind relativ, und beziehen sich auf dieses Arbeitsverzeichnis. Mit

    GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer)
    

    kannst du das aktuelle Verzeichnis auslesen.



  • 1. ifstream ist völlig überflüssig, da die Größe bereits in fData.nFileSizeLow steht.

    2. FindFirstFile liefert bei einem Fehler INVALID_HANDLE_VALUE zurück, daher darf hSearch nicht auf TRUE geprüft werden.

    3. Der Ordner muss mit vollem Pfad angegeben werden, ansonsten bezieht sich FindFirstFile auf das aktuelle Arbeitsverzeichnis.



  • Danke für deine Antwort!

    sri schrieb:

    3. Der Ordner muss mit vollem Pfad angegeben werden, ansonsten bezieht sich FindFirstFile auf das aktuelle Arbeitsverzeichnis.

    Es soll sich ja aufs aktuelle Arbeitsverzeichnis beziehen, nur eben noch auf einen Ordner der in dem Arbeitsverzeichnis ist.



  • maybe helps,

    DWORD GetDirectoryFilesizes()
    {
    	HANDLE fHandle; 
    	WIN32_FIND_DATA wfd; 
    
    	DWORD FilesSizes=0;
    
    	fHandle = FindFirstFile("c:\...\...\*.jpg",&wfd); 
    	if(INVALID_HANDLE_VALUE != fHandle)
    	{
    		do 
    		{ 
    		 if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) 
    		 { 
    			if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
    			{ 
    				// folders
    			} 
    			else 
    			{ 
    				   FilesSizes+=(wfd.nFileSizeHigh * (MAXDWORD+1)) + wfd.nFileSizeLow;// sum filesizes 
    			} 
    		 } 
    		} 
    		while (FindNextFile(fHandle,&wfd)); 
    		FindClose(fHandle);
    	}
    
    	return FilesSizes;
    }
    


  • [b]DWORD[/b] FilesSizes=0;
    ...
    ...
    FilesSizes+=(wfd.nFileSizeHigh * (MAXDWORD+1)) + wfd.nFileSizeLow;// sum filesizes
    

    rofl!



  • Johnny Z. schrieb:

    Danke für deine Antwort!

    sri schrieb:

    3. Der Ordner muss mit vollem Pfad angegeben werden, ansonsten bezieht sich FindFirstFile auf das aktuelle Arbeitsverzeichnis.

    Es soll sich ja aufs aktuelle Arbeitsverzeichnis beziehen, nur eben noch auf einen Ordner der in dem Arbeitsverzeichnis ist.

    Dann solltest Du Dir das aktuelle Arbeitsverzeichnis mit GetCurrentDirectory holen und daran dann die relative Pfadangabe anfügen (wie Halbleiter es schon schrieb).


Anmelden zum Antworten