Liste récursive des fichiers contenue dans un dossier [Résolu/Fermé]

Messages postés
331
Date d'inscription
mardi 24 février 2015
Statut
Membre
Dernière intervention
3 novembre 2019
-
Bonjour,

quelque'un pourrais me dire comment faire pour lister récursivement l’intégralité des fichier contenue dans un dépôt ou dossier ?
mon programme me permet déjà :
- de lister tout les fichiers d'un dossier
- de faire la différence entre fichier et dossier
- écrire la liste des fichiers dans un LOG.txt dans le dossier concerner.

mais a partir de la c'est la galère.
voici un schéma pour m'illustrer :

Depot
|
|-fichier1
|-fichier2
|-fichier3
|---dossierA
|---|
|---|- fichierA1
|---|- fichierA2
|---|- fichierA3
|---|---dossierAA
|---|---|
|---|---|-fichierAA1
|---|---|-fichierAA2
|---|---|-fichierAA3
|---|---|----------------------------LOG.TXT n°1 (contient tout les fichiers AA)
|---|
|---|- fichierA4
|---|--------------------------------LOG.TXT n°2 (contient tout les fichiers A)
|
|---dossierB
|---|
|---|-fichierB1
|---|-fichierB2
|---|---dossierBA
|---|---|
|---|---|-fichierBA1
|---|---|--------------------------LOG.TXT n°3 (contient le fichier BA1)
|---|
|---|------------------------------LOG.TXT n°4 (contient tout les fichiers B)
|
|-fichier4
|-fichier5
|----------------------------------LOG.TXT n°5 (contient tout les fichiers de Depot)


quand je dit "contient tout les fichier" c'est uniquement leur nom.
Imaginons que chaque fichier et trié par ordre alphabétique.
lors du lancement de l'executable mon programme commence a lister le contenue du dernier dossier trouvé soit le "dossierBA" puis liste "dossierB" puis "dossierAA" puis "dossierA" pour finir avec "Depot"

Seul les LOG.TXT n°3 et 4 fonctionne car ce sont les premiers traité et que "dossierB" ne contient pas de fichier apres le "dossierBA" autrement sa aurais planter.

le problème est :
quand je demande a opendir() d’ouvrir "dossierAA" il est impossible que a la fin de ce dernier, je lui redonne l'ordre d’ouvrir le "dossierA" car ce dernier a déjà commencer a être lister mais n'a pas pue être fini car "dossierAA" a était trouvé avant que tout les fichier de "dossierA" ne soit fini d’être lister, en effet "fichierA4" est absent .

je ne fournie pas de code car cela ne servirais a rien ici.
je voudrais justement le remplacer.
avez vous une idée pour crée tout les LOG.TXT en récursif ?

merci de m'avoir lue jusqu'au bout j’espère avoir était claire .
a bientôt je l’espère

Afficher la suite 

1 réponse

Messages postés
98
Date d'inscription
dimanche 12 juin 2016
Statut
Membre
Dernière intervention
16 janvier 2018
24
0
Merci
Bonjours,
Pour ton problème, je pense que tu te complique la tâche. Si tu veut seulement loguer dossier par dossier avec un log dans chaque dossier, et bien tu peut reprendre les algos du recherche de fichier.

L'idée c'est d'optimiser les ressources avec du multithreading.

=> Tu crée une fonction "BrowseFolder(std::string& path)" qui parcourt le dossier renseigné en chemin, crée un fichier log.txt et y inscrit l'ensemble des fichiers et dossiers trouvés (via d'autres fonction éventuellement pour alléger le code)

=> Ensuite, si cette fonction trouve un dossier, elle démarre un nouveau thread dans lequel elle s’appelle avec en paramètre le chemin de ce dossier. Elle continue ensuite sa boucle sur les fichiers jusqu’à qu'il ne reste aucun fichiers ou dossier. Une fois qu'elle termine, le thread dépile et se ferme jusqu’à ce qu'il ne reste plus que le thread principal. Et la tu fait ce que tu veut pour la fin du programme.

(bien sur le multitread est facultatif, la fonction peut très bien s'appeler elle même sans nouveau thread mais c'est moins rapide bien que ce soit moins énergivore.)
ElementW
Messages postés
4889
Date d'inscription
dimanche 12 juin 2011
Statut
Contributeur
Dernière intervention
9 octobre 2019
862 -
BrowseFolder(std::string& path)

BrowseFolder(const std::string& path)
plutôt.
astrocurieux
Messages postés
331
Date d'inscription
mardi 24 février 2015
Statut
Membre
Dernière intervention
3 novembre 2019
2 -
Bonjour,

je suis desolé de mon temps de reaction pour vous repondre.
je n'avait pas pensé au tread, c'est une bonne idée que je garde en téte.

mon algo fonctionne deja sur la base du recurcif, mais comporte quelque bug que je doit encore résoudre .

je reviendrais vers vous quand j'aurais de nouveau ce programme en téte.