Leere Verzeichnisse auslesen



  • Hallo Leute,

    ich habe mir mal interessehalber das RTMF Thread durchgelesen und jetzt ungefähr nach den Richtlinien meine Frage:

    ICh bezeichne mich als blutigen Wiedereinsteiger, habe vor Jahren zu Schulzwecken C/C++ programmiert,musste dann aber aus "Umgebungszwang" auf Visual Basic umschwenken und programmiere darin.

    Mein C - Wissen ist dabei verkümmert und ich muss es mal wieder anwenden.

    Ich habe folgendes Problem, ich möchte in meinem Code alle Dateien aus einem Verzeichnis lesen und bearbeiten, das funktioniert super, das Programm stürzt nur gnadenlos ab, wenn das Verzeichnis leer ist (mir soweit auch klar), ich möchte nun abfangen, das das Verzeichnis leer ist:

    main ()
    {
     char imppath[]="./tmp/";
     char datverz[2048];
     FILE *dat_ein;
     char puffer[2048];
     DIR *dirHandle;
     struct dirent * dirEntry;
     //printf("test");
     dirHandle = opendir(imppath);
     if (dirHandle)
        	{
           		while (0 != (dirEntry = readdir(dirHandle))) //Werden hier nicht leere Inhalte abgefangen?
           		{
              		if(strcmp(dirEntry->d_name, ".") == 0 || strcmp(dirEntry->d_name, "..") == 0)
              		{//verzeichnisse ignorieren
                			continue;
                		}
              		if(dirEntry->d_name==NULL) //Suche hier wo ich abfangen kann das keine Dateien da sind
              		{
              		 printf("%s","Leeres Verzeichnis");
              		}
              		//Pfad und Dateinamen zusammenbauen!
              		strcpy(datverz,imppath);
              	   	strcat(datverz,dirEntry->d_name);
             	   	fflush(stdin);
    
            		//Dateien im Verzeichnis öffnen
            		if ((dat_ein=fopen(datverz,"rb"))==NULL)
                    		{
                            		rc=writeprot("Fehler in der Dateiverarbeitung");
                    		}
    
            		while(fgets(puffer,sizeof(puffer),dat_ein)!=0 )
            			{
    
            			}
            	fclose(dat_ein);
                    }
           		closedir(dirHandle);
        	}
    
    }
    

    Ich weiss aber nicht wie ich es am besten abfange, ich dachte in dem ich s.o. sage:

    if(dirEntry->d_name==NULL)
    

    aber ich glaube die Bedingung NULL ist falsch??? Wie drücke ich leer aus?

    Oder sollte ich meine Bedingung :

    if ((dat_ein=fopen(datverz,"rb"))==NULL)
            {
             rc=writeprot("Fehler in der Dateiverarbeitung");
            }
    
            while(fgets(puffer,sizeof(puffer),dat_ein)!=0 )
    

    umdrehen, das meine Code nur ausgeführt wird, wenn:

    if ((dat_ein=fopen(datverz,"rb"))!=NULL)
    

    ist?

    Habe ich einen Denkfehler???? 😕

    Danke schonmal für Eure Hilfe!!!

    Gruss Alex

    PS: Bitte mir das Visual Basic nicht übel nehmen, hatte schon miese Reaktionen darauf 😉 😃



  • Ich weiss aber nicht wie ich es am besten abfange, ich dachte in dem ich s.o. sage:

    if(dirEntry->d_name==NULL)
    

    aber ich glaube die Bedingung NULL ist falsch??? Wie drücke ich leer aus?

    Ja, vermutlich - man: dirent.d_name ist ein Char-Array, also ziemlich sicher nicht NULL. Und eigentlich sollte die while()-Bedingung auch zuschlagen, wenn du mit das Verzeichnis durch hast (bei einem leeren Verzeichnis nach den beiden Systemordnern "." und "..").

    Eventuell solltest du mal mit einem Debugger durchgehen, was in der Schleife genau passiert.

    PS: Mit Visual Basic habe ich keine Probleme, eher mit dem fehlenden Rückgabetyp für die main() oder mit fflush(stdin).



  • Hi CSTOLL,

    das dachte ich auch, dass die While Schleife das abfängt 😞
    Aber ich denke mal du stimmst meinen Code zu, kein Denkfehler drin? 😕
    Ich checke es mal im Debugger ... ➡

    Cool, ich habe deine Probleme gelöst *grins* ... nein ... ich habe meinen Code, ein bisschen verkleinert, und mit Copy/Paste nur das wichtigste für das Problem eingefügt ➡ RTMF , dabei habe ich den Rückgabewert der main vergessen, in meinem "richtigen" Code ist

    int main()
    { ...
    
    return 0
    }
    

    drin ... Aber danke für den Hinweis, vergesse ich zu gern 🙂

    Gruss Alex


Anmelden zum Antworten