Arbre de hiérarchie trop grand en utilisant la récursivité, la recherche de fichier est bloquée

J’ai écrit un code pour rechercher un fichier spécifique, où l’utilisateur entre un chemin de départ et un nom de fichier, puis le programme imprime ses détails si le fichier existe ou imprime autrement.

Comme je le pensais, l’utilisation de la récursivité fait planter le code lorsque l’arborescence de la hiérarchie est trop grande, j’ai essayé avec 400 répertoires et cela a échoué, donc je suppose qu’après quelque chose comme 50 dossiers un vers l’autre, la surcharge de la récursivité fait planter le code.

Des suggestions pour résoudre ce problème? fondamentalement, le code est correct pour la hiérarchie d’arborescence de bas niveau, mais je dois le concevoir pour des arbres sains (500 à 600 dossiers l’un dans l’autre, et un fichier stocké dans le dernier dossier) également, merci

Vous pouvez supprimer la récursivité (c.-à-d. Convertir en une solution itérative) en stockant les répertoires tels que vous les voyez (au lieu de les traiter immédiatement), puis en les renvoyant à une itération ultérieure. Cependant, vous risquez de ne pas obtenir une sortie exactement identique (les choses peuvent être ordonnées différemment).

La façon dont cette méthode fonctionne est d’avoir une liste de répertoires à traiter, et vous parcourez cette liste (en y ajoutant n’importe quel répertoire enfant).

Dans psuedocode / Python:

 def print_dirs(path, recursive, filename): dir_stack = empty stack dir_stack.push(path) while dir_stack is not empty: dir = dir_stack.pop() # returns the head element (and removes it) for file in children(dir): # ...do stuff with names... if recursive and file is a directory: dir_stack.push(file) # process the directory later 

Une stack peut être implémentée en tant que liste liée simple assez facilement. Notez que le traitement spécial est requirejs si le path n’est pas un répertoire et que cela n’est pas récursif.

La façon la plus sale est d’ augmenter la taille de la stack .

La seconde consiste à remplacer char full_name[_POSIX_PATH_MAX + 1] par un caractère char *fullname=malloc((_POSIX_PATH_MAX + 1)*sizeof(char)) et n’oubliez pas de le free() après un appel récursif.

Et peut-être le meilleur est de supprimer ce code et d’utiliser la puissante find omniprésente