Comment faire pour obtenir le contenu d'un répertoire dans C ++

Si vous voulez lire le contenu d'un répertoire, vous allez vraiment contre ce qui est disponible dans la langue standard C ++. Cependant, les bonnes âmes des grandes bibliothèques de C ++ (qui est, les gens qui ont écrit la plupart des bibliothèques disponibles C ++) généralement construites dans certaines fonctions pratiques pour obtenir le contenu d'un répertoire.

Un répertoire contient généralement plusieurs fichiers ainsi que d'autres répertoires. Obtention d'une liste des matières est impliqué. Il ne suffit pas d'appeler une fonction et d'obtenir quelque chose en retour.

Bien sûr, si la bibliothèque C ++ standard inclus une fonction pour obtenir des informations, il serait probablement une classe de modèle qui contient le contenu du répertoire. Hélas, la bibliothèque ne le supporte pas. Au lieu de cela, vous devez grimper à travers certaines fonctions. Voici comment cela fonctionne.

  1. Appel _findfirst (), passer un chemin d'accès et un modèle pour les fichiers dont les noms que vous voulez trouver.

    Par exemple, passer *. * pour obtenir tous les fichiers dans le répertoire, ou *.SMS pour obtenir tous les fichiers se terminant en .SMS. Aussi passer un pointeur vers un _finddata_t structure.

  2. Consultez les résultats de _findfirst ().

    Si _findfirst () renvoyé -1, il n'a pas trouvé de fichiers (ce qui signifie que vous avez terminé). Sinon, il remplit la _finddata_t la structure avec le premier fichier qu'il trouve, et il sera de retour un numéro que vous utilisez dans les prochains appels aux différentes fonctions de trouver.




  3. Regarde le _finddata_t structure pour déterminer le nom du fichier, et d'autres informations telles que la date, date du dernier accès, et la taille de créer.

  4. Appel _trouver le suivant() et transmettre les valeurs suivantes: le nombre de retour de _findfirst () et l'adresse d'un _finddata_t structure

    Si _trouver le suivant() retours -1, il a trouvé plus files- vous pouvez passer à l'étape 5. Sinon, regarder le _finddata_t la structure pour obtenir les informations pour la prochaine fichier trouvé. Puis répétez l'étape 4.

  5. Appel _findclose () et passer le nombre de retour de _findfirst ().

    Vous êtes tous terminé.

Youch! Voilà sorte de bizarre, mais il est comment les choses étaient à faire dans les vieux jours de programmation, avant que les langues dominantes développées ces caractéristiques civilisés que les classes et objets.

La GetDirectoryContents exemple montre comment mettre en œuvre cet élégant, processus à l'ancienne.

#comprendre #include #include #include using namespace std-Chop chaîne (string str) {chose à cordes = str-int len ​​= str.length () - si (str [len - 1] == ' r') {res.replace (len - 1, 1, "") -} len = str.length () - si (str [len - 1] == ' n') {res.replace (len - 1, 1, "") -} return} res- vide DumpEntry (_finddata_t données) {string CreateTime (ctime (data.time_create)) - cout lt; lt; Chop (CreateTime) lt; lt; " t" -cout lt; lt; data.size lt; lt; " t" -si ((data.attrib _A_SUBDIR) == _A_SUBDIR) {Cout lt; lt; "[" lt; lt; data.name lt; lt; "]" lt; lt; endl-} else {cout lt; lt; data.name lt; lt; endl -}} int main () {_ données int finddata_t ff = _findfirst ("../*.*", données) -Si (ff! = -1) {int res = 0-temps (res! = -1) {DumpEntry (données) -res = _findnext (ff, données) -} _ FindClose (ff) -} return 0-}

Vous pouvez voir comment main ()suit les étapes décrites simplement. Et pour chacune des structures de données, la fonction appelée DumpEntry () a été utilisé. La DumpEntry () fonction imprime les informations sur le fichier. Voici ce que vous devriez voir lorsque vous exécutez l'application (l'entrée de répertoire courant, l'entrée de répertoire parent, et les quatre autres répertoires contenant des exemples):

Sun 15 décembre 19:40:00 20130 [.] Sun 15 décembre 19:40:00 20130 [..] Sun 15 décembre 19:40:00 20130 [DeleteDirectory] Sun 15 décembre 19:40:00 20130 [GetDirectoryContents] Sun 15 décembre 19:40:00 20130 [makeDirectory] Sun 15 décembre 19:40:00 20130 [RenameFile]

Notez comment, dans le DumpEntry () fonction, vous testez si l'article est un répertoire. Ceci est une autre façon vieille (mais fiable) à programmer: Vérifier la présence d'un petit peu particulier dans le milieu de la attrib membre de la structure, comme ceci:

if (data.attrib _A_SUBDIR == _A_SUBDIR) {Cout lt; lt; "[" lt; lt; data.name lt; lt; "]" lt; lt; endl-}

Et enfin, vous remarquerez une étrange fonction inclus appelé Chop (). Voilà parce que le ctime () fonction - sinon à portée de main pour le formatage de l'heure - ajoute un retour chariot (ou nouvelle ligne) À la fin de la chaîne qu'il crée. Alors que les hacher au large. Sinon l'information après la date doit commencer sur la prochaine ligne de texte, qui n'a pas été souhaitée.


» » » » Comment faire pour obtenir le contenu d'un répertoire dans C ++