Comment obtenir la liste des fichiers dans le répertoire C++
-
Utilisez
std::filesystem::directory_iterator
pour obtenir une liste de fichiers dans un répertoire -
Utiliser les fonctions
opendir/readdir
pour obtenir une liste de fichiers dans un répertoire -
Utilisez
std::filesystem::recursive_directory_iterator
pour obtenir une liste des fichiers dans tous les sous-répertoires
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;
}
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