#include #include #include #include #include #include #include #include #include #include /* compte le nombre d'entrées de type fichier dans un répertoire */ int count_files(char* dirname) { int nb_fichiers = 0; /* ouvre le répertoire */ DIR*d = opendir(dirname); if(!d) { perror("opendir"); exit(1); } struct dirent* de = NULL; /* on parcourt toutes les entrées du répertoire */ while((de = readdir(d))!= NULL) { /* parmi les entrées, '.' et '..' ne nous intéressent pas. Ignorons les */ if(strcmp(de->d_name, ".") != 0 && strcmp(de->d_name, "..") != 0) { if(de->d_type == DT_REG) { /* l'entrée est un fichier régulier */ nb_fichiers++; } else if(de->d_type == DT_DIR) { /* l'entrée est un répertoire */ int len = (strlen(dirname)+strlen(de->d_name)+2); char* str = malloc(sizeof(char)*len); snprintf(str, len, "%s/%s", dirname, de->d_name); nb_fichiers += count_files(str); free(str); } } } /* ferme le répertoire */ closedir(d); return nb_fichiers; } int main(int argc, char**argv) { if(argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return EXIT_FAILURE; } /* on crée une copie du nom de répertoire */ int len = strlen(argv[1]) + 1; char* str = malloc(sizeof(char)*len); snprintf(str, len, "%s", argv[1]); int nb_fichiers = count_files(str); printf("Il y a %d fichiers dans le répertoire %s, dont %d accessibles en écriture\n", nb_fichiers, str, nb_fichiers_ecriture); return EXIT_SUCCESS; }