Comment obtenir la liste des fichiers dans le répertoire C++

Jinku Hu 12 octobre 2023
  1. Utilisez std::filesystem::directory_iterator pour obtenir une liste de fichiers dans un répertoire
  2. Utiliser les fonctions opendir/readdir pour obtenir une liste de fichiers dans un répertoire
  3. Utilisez std::filesystem::recursive_directory_iterator pour obtenir une liste des fichiers dans tous les sous-répertoires
Comment obtenir la liste des fichiers dans le répertoire C++

Dans cet article, nous allons présenter les moyens d’obtenir une liste de fichiers dans un répertoire spécifique.

Utilisez std::filesystem::directory_iterator pour obtenir une liste de fichiers dans un répertoire

Cette méthode fait partie de la bibliothèque <filesystem> ajoutée en C++17. Notez que certains compilateurs plus anciens peuvent ne pas prendre en charge cette méthode, mais c’est la solution native du C++ pour ce problème. L’option directory_iterator est utilisée dans une boucle for basée sur une plage, et elle prend le chemin d’accès au répertoire comme argument. Dans cet exemple, nous spécifions un chemin vers le répertoire racine, mais vous devez modifier cette variable en fonction de votre système pour lui passer un nom valide.

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::directory_iterator;

int main() {
  string path = "/";

  for (const auto& file : directory_iterator(path)) cout << file.path() << endl;

  return EXIT_SUCCESS;
}

Production (dépend du répertoire):

Archive2| lib| .| ..| lib64| Archive| dev| var| bin| usr| etc| tmp| proc|

Utiliser les fonctions opendir/readdir pour obtenir une liste de fichiers dans un répertoire

Cette méthode est beaucoup plus verbeuse, mais c’est une alternative fiable pour la manipulation du système de fichiers.

Pour utiliser les fonctions opendir/readdir, vous devez inclure le fichier d’en-tête dirent.h.

opendir ouvre un répertoire spécifié par son nom et retourne son pointeur, qui est de DIR*.

readdir fonctionne avec l’argument DIR* et retourne une structure spéciale appelée dirent (voir info complète).

Une fois que nous avons mis l’appel readdir dans une boucle while par rapport à nullptr, il agit comme un itérateur de répertoire, et nous pouvons avoir accès aux noms de fichiers à travers chaque structure dirent retournée.

#include <dirent.h>

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main() {
  DIR *dir;
  struct dirent *diread;
  vector<char *> files;

  if ((dir = opendir("/")) != nullptr) {
    while ((diread = readdir(dir)) != nullptr) {
      files.push_back(diread->d_name);
    }
    closedir(dir);
  } else {
    perror("opendir");
    return EXIT_FAILURE;
  }

  for (auto file : files) cout << file << "| ";
  cout << endl;

  return EXIT_SUCCESS;
}

Notez que la plupart des instructions if agissent comme des mécanismes de gestion des exceptions puisque les fonctions opendir et readdir retourner des pointeurs NULL sur l’erreur/la fin du répertoire.

Utilisez std::filesystem::recursive_directory_iterator pour obtenir une liste des fichiers dans tous les sous-répertoires

Cette méthode est utile lorsque plusieurs sous-répertoires doivent être recherchés pour des noms de fichiers spécifiques. La méthode reste la même que celle de directory_iterator. Vous devez juste la parcourir avec une boucle basée sur la plage et opérer sur les fichiers selon les besoins:

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::recursive_directory_iterator;

int main() {
  string path = "./";

  for (const auto& file : recursive_directory_iterator(path))
    cout << file.path() << endl;

  return EXIT_SUCCESS;
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ File