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.