Pourquoi auriez-vous besoin d'une liste de fichiers en C++ ?
Imaginez : vous écrivez un programme qui doit traiter des centaines de logs, vérifier la présence de fichiers de configuration ou simplement montrer à l'utilisateur ce qui se trouve dans un dossier. Sans la capacité de « regarder » à l'intérieur d'un répertoire, vous vous heurtez à un mur. C'est pourquoi la question « How can I get the list of files in a directory using C or C++? » est l'une des plus populaires sur Stack Overflow. Et aujourd'hui, nous allons la décortiquer de A à Z.
Dans cet article, je vais vous montrer trois méthodes principales : du classique style C (fonctionne partout, mais nécessite de la rigueur) au moderne C++17 std::filesystem (concis, sûr et élégant). Vous apprendrez à choisir le bon outil pour votre tâche et obtiendrez des exemples de code prêts à être insérés dans votre projet.
Méthode 1 : La classique — dirent.h (POSIX / Linux / macOS)
Cette méthode est le « grand-père » de toutes les solutions. Elle est utilisée en C et C++ sur les systèmes de type Unix. Le principe est simple : vous ouvrez un répertoire, lisez les entrées une par une, puis le fermez. Pas de fioritures, mais un contrôle total.
Inclusion et structures
Vous aurez besoin de :
#include <dirent.h>— pour travailler avec les répertoiresDIR *dir— un pointeur vers le flux du répertoirestruct dirent *entry— une structure contenant le nom du fichier
Exemple de code : affichage simple de tous les noms
#include <iostream>#include <dirent.h>
int main() { const char* path = "."; // dossier courant DIR* dir = opendir(path); if (dir == nullptr) { std::cerr << "Impossible d'ouvrir le répertoire : " << path << std::endl; return 1; }
struct dirent* entry; while ((entry = readdir(dir)) != nullptr) { std::cout << entry->d_name << std::endl; }
closedir(dir); return 0;}Points importants à noter
- La fonction
readdir()retourne les noms.(répertoire courant) et..(répertoire parent). Il faut généralement les ignorer :
if (entry->d_name[0] == '.') continue;- Ce code **ne fonctionne pas sur Windows** par défaut. Pour Windows, il existe
windows.hetFindFirstFile/FindNextFile(nous y reviendrons). - Avantages : minimaliste, fonctionne sans C++17. Inconvénients : non multiplateforme, pas de filtrage par type de fichier.
Méthode 2 : API Windows — FindFirstFile et FindNextFile
Si votre cible est Windows, oubliez dirent.h. Utilisez plutôt l'API Win32 native. Elle est puissante, mais le code est verbeux.
Comment ça fonctionne
- Vous appelez
FindFirstFileavec un modèle (par exemple,"C:\\\\*"). - Vous obtenez un handle et la première entrée.
- Dans une boucle, vous appelez
FindNextFilejusqu'à ce qu'elle retourne 0. - Vous fermez le handle avec
FindClose.
Exemple : liste des fichiers à la racine du disque C:
#include <iostream>#include <windows.h>
int main() { WIN32_FIND_DATA findFileData; HANDLE hFind = FindFirstFile("C:\\\\*", &findFileData);
if (hFind == INVALID_HANDLE_VALUE) { std::cerr << "Impossible de trouver les fichiers (code d'erreur : " << GetLastError() << ")" << std::endl; return 1; }
do { // Ignorer "." et ".." if (strcmp(findFileData.cFileName, ".") != 0 && strcmp(findFileData.cFileName, "..") != 0) { std::cout << findFileData.cFileName << std::endl; } } while (FindNextFile(hFind, &findFileData) != 0);
FindClose(hFind); return 0;}Ce qu'il faut savoir
- Dans
WIN32_FIND_DATA, il y a un champdwFileAttributes