Fonction récursive pour la liste de tous les fichiers dans les sous répertoires
Je suis en train d'écrire une fonction qui renvoie une liste de tous les fichiers du dossier actuel et tous ses sous-dossiers. J'ai écrit ce code:
#include <iostream>
#include <dirent.h>
#include <cstring>
using namespace std;
int main() {
DIR* dir; dirent* pdir;
//From my workspace
dir=opendir(".");
while (pdir=readdir(dir)) {
if(/**********This pdir is a directory**********/) {
/**********RECURSIVE CALL SHOULD BE HERE**********/
cout<<pdir->d_name<<endl;
}
}
closedir(dir);
return 0;
}
J'ai cherché dans google et je ne sais pas comment faire:
- Vérifier si le courant
pdir
est un répertoire - Aller à l'intérieur du répertoire et d'effectuer l'appel récursif sur elle
En attendant j'ai tout avoir sous la main car je ne sais toujours pas quels sont les arguments de la fonction récursive doit avoir.
Un indice?
- Pour quelle plate-forme? edit: dans quel ordre? en précommande, afinde, ou postorder?
- Jetez un oeil à stackoverflow.com/questions/3844546/... pour ta première question, et ensuite de msdn.microsoft.com/en-us/library/windows/desktop/... ou de l'appel posix "chdir(2)" pour ton deuxième
- Je ne se soucie pas de l'ordre tant que je peux la liste de tous les fichiers.
- Notez que l'on peut pas de manière récursive invoquer
main()
. - en effet.. j'ai édité la question.
- Jetez un oeil à cette boost système de fichiers tutoriel. Vous avez besoin de la bibliothèque de cours.
Vous devez vous connecter pour publier un commentaire.
Isoler ce code dans une procédure qui prend le chemin du répertoire de base comme un paramètre, vous pouvez effectuer l'appel récursif. Il doit être quelque chose comme
Ensuite, pour vérifier si la
pdir
vous obtenu est un répertoire, vous avez deux itinéraires:pdir->d_type==DT_DIR
; cela vous donne cette information immédiatement, mais il n'est pas portable (POSIX ne précise pas l'existence de lad_type
membre); de plus, il n'est pas pris en charge par tous les systèmes de fichiers, de sorte que vous pouvez obtenirDT_UNKNOWN
. Si vous voulez suivre les liens symboliques, vous avez à effectuer des contrôles supplémentaires aussi si vous obtenezDT_LNK
. Dans ces cas, vous devez revenir àlstat
(voir le point ci-dessous);lstat
pour obtenir des informations sur chaque fichier, en vérifiant notamment last_mode
champ destruct stat
.d_type
existe, vous devez avoir le secours destat
parce que le système de fichiers n'est pas nécessaire de remplird_type
même si le système d'exploitation prend en charge. Aussi,d_type
valeurs sont pas masques de bits, vous voulez juste(pdir->d_type == DT_DIR)
.Ici est une version à l'aide de la proposition d'une norme de système de fichiers de la bibliothèque:
À moins que votre but est d'apprendre comment écrire une fonction récursive, vous préférerez peut-être cette simple boucle basée sur Coup de pouce.Système de fichiers:
Ou même le seul appel de la fonction:
Mon approche en C++11:
Utilisation:
!f->d_name
toujours true.Chemin ressemble à
/your_path/
. Pour la recherche dans les dossiers cachés, vous devez ajouter un troisième paramètretrue
.Vous pouvez vérifier si il n'y a pas de "." dans la chaîne.
.
est parfaitement bien le nom de répertoire de la partie.À l'aide de C++17 recursive_directory_iterator il devient aussi concis que:
Avec exemple de sortie: