Comment parcourir récursivement un répertoire et imprimer tous les fichiers en C?

J’essaie de parcourir récursivement un répertoire et d’imprimer tous les fichiers.

Lorsque j’essaie de le faire avec le code ci-dessous, par exemple, j’appelle la fonction avec sprint (“.”, “.”) Je reçois un tas de points.

Lorsque je réduis la quantité de processus ouverts autorisés (ulimit -n 20), j’obtiens 17 points. Je ne comprends pas parce que je pensais que readdir () et opendir () ne font pas de nouveaux processus. Voici mon code:

void sprint(char *filename, char * dirToOpen) { DIR *directory = opendir(dirToOpen); struct dirent *entry; struct stat s; char pathname[1024]; if (directory) { /*if it's a directory*/ while ((entry = readdir(directory)) != NULL) { /*while there are more ensortinges to read*/ if(strcmp(entry->d_name, filename) == 0) /*if entry name corresponds to filename, print it*/ printf("%s\n", filename); sprintf(pathname, "./%s", entry->d_name); /*makes pathname*/ if (lstat(pathname, &s) == 0 && S_ISDIR(s.st_mode)) { /*if the file is a directory*/ if(strcmp(entry->d_name, "..") != 0 && strcmp(entry->d_name, ".") != 0) /*if the directory isn't . or ..*/ sprint(filename, entry->d_name); } } closedir(directory); } } 

En outre, quelque part, il n’atteint pas le rest des fichiers, car il n’imprime que des points, pas le nom complet du fichier. Je pense que c’est quelque part dans ma dernière boucle, mais je ne suis pas sûr.

Voici un code récursif qui fait cela:

 void sprint(char *filename, char * dirToOpen, int level = 0) { DIR *dir; struct dirent *entry; struct stat s; if (!(dir = opendir(dirToOpen))) return; if (!(entry = readdir(dir))) return; do { if(lstat(dirToOpen, &s) == 0 && S_ISDIR(s.st_mode)) /*if it's a directory*/ { char path[1024]; int len = snprintf(path, sizeof(path)-1, "%s/%s", dirToOpen, entry->d_name); /*makes pathname*/ path[len] = 0; if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) /*if the directory isn't . or ..*/ continue; printf("%*s[%s]\n", level * 2, "", entry->d_name); sprint(filename ,path, level + 1); } else { if(strcmp(entry->d_name, filename) == 0 || strcmp(filename, ".") == 0) /*if entry name corresponds to filename, print it*/ printf("%*s- %s\n", 2, "", entry->d_name); } } while (entry = readdir(dir)); /*while there are more ensortinges to read*/ closedir(dir); } 

Appelez-le avec sprint(".", "."); parcourir récursivement un répertoire et imprimer tous les fichiers.

Inspiré de cette réponse.