Rekursiv durch Verzeichnisbaum laufen und Dateigrößen addieren



  • Hi,

    der Titel sagt eigentlich was ich vorhabe. Mein Entwurf bisher:

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <inttypes.h>
    #include <stdlib.h>
    #include <dirent.h>
    
    int main(int argc, char *argv[]) {
          if(argc != 2) {
          fprintf(stderr,"Benutzung : %s Directory\n", argv[0]);
          return EXIT_FAILURE;
       }
    
       printf("%i", readidir (argv[1]));
       return 0;
    }
    
    int readidir (char *name)
    {
    	int zaehler;
    	zaehler = 0;
          DIR *dir;
       struct dirent *dirzeiger;
       struct stat puffer;
    
       if((dir=opendir(name)) == NULL) {
          fprintf(stderr,"Fehler bei opendir ...\n");
          return -1;
       }
    
       while((dirzeiger=readdir(dir)) != NULL) {
          printf("%s",(*dirzeiger).d_name);
    	 if (stat((*dirzeiger).d_name, &puffer) == -1) {
    		 fprintf(stderr, "Fehler bei stat ...");
    		 return -1;
    	 }
    	 if ((puffer.st_mode & S_IFDIR) && !(*dirzeiger).d_name == ".." && !(*dirzeiger).d_name == ".")
    	 {
    		 printf(" d \n");
    		 zaehler += readidir((*dirzeiger).d_name);
    	 }
    	 if (puffer.st_mode & S_IFREG) {
    		 printf (" f \n");
    	 	zaehler += puffer.st_size;
    	 }
       }
    
       if(closedir(dir) == -1)
          printf("Fehler beim Schließen von %s\n", name);
       return zaehler;
    
    }
    

    Leider geht er nicht rekrusiv in die Verzeichnisse so wie ich es möchte 😞 Was mache ich falschen?

    Vielen Dank

    Joachim



  • Klammerfehler in Zeile 38, aber wenn ich den löse und durch

    if ((puffer.st_mode & S_IFDIR) && !((*dirzeiger).d_name == "..") && !((*dirzeiger).d_name == "."))
    

    ersetze, dann wird es schlimmer. Er wechselt in die Verzeichnisse .. und ., obwohl ich ihm das doch verbiete 😕



  • Strings vergleicht man nicht mit == sondern mit strcmp.



  • Du kannst dir auch die Implementations von du ansehen.


Anmelden zum Antworten