Obtenir la liste des fichiers dans un dossier en C++ : guide complet du débutant au professionnel

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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épertoires
  • DIR *dir — un pointeur vers le flux du répertoire
  • struct 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.h et FindFirstFile/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

  1. Vous appelez FindFirstFile avec un modèle (par exemple, "C:\\\\*").
  2. Vous obtenez un handle et la première entrée.
  3. Dans une boucle, vous appelez FindNextFile jusqu'à ce qu'elle retourne 0.
  4. 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 champ dwFileAttributes

Blogs

Book Recommendations