Dateien in einem Ordner mit C++ auflisten: Vollständiger Leitfaden vom Anfänger zum Profi

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum benötigen Sie eine Liste von Dateien in C++?



Stellen Sie sich vor: Sie schreiben ein Programm, das Hunderte von Logs verarbeiten, das Vorhandensein von Konfigurationsdateien überprüfen oder dem Benutzer einfach anzeigen soll, was sich in einem Ordner befindet. Ohne die Fähigkeit, in ein Verzeichnis „hineinzuschauen“, stoßen Sie an eine Wand. Genau deshalb ist die Frage „How can I get the list of files in a directory using C or C++?“ eine der beliebtesten auf Stack Overflow. Und heute werden wir sie von Grund auf durchgehen.



In diesem Artikel zeige ich drei Hauptmethoden: vom klassischen C-Stil (funktioniert überall, erfordert aber Sorgfalt) bis zum modernen C++17 std::filesystem (prägnant, sicher und elegant). Sie erfahren, wie Sie das richtige Werkzeug für Ihre Aufgabe auswählen, und erhalten fertige Codebeispiele, die Sie sofort in Ihr Projekt einfügen können.



Methode 1: Der Klassiker — dirent.h (POSIX / Linux / macOS)



Diese Methode ist der „Großvater“ aller Lösungen. Sie wird in C und C++ auf Unix-ähnlichen Systemen verwendet. Das Prinzip ist einfach: Sie öffnen ein Verzeichnis, lesen die Einträge einzeln aus und schließen es wieder. Keine Schnörkel, dafür volle Kontrolle.



Einbindung und Strukturen

Sie benötigen:

  • #include <dirent.h> — für die Arbeit mit Verzeichnissen
  • DIR *dir — ein Zeiger auf den Verzeichnisstrom
  • struct dirent *entry — eine Struktur, die den Dateinamen enthält


Codebeispiel: Einfache Ausgabe aller Namen

#include <iostream>#include <dirent.h>

int main() { const char* path = "."; // aktuelles Verzeichnis DIR* dir = opendir(path); if (dir == nullptr) { std::cerr << "Konnte Verzeichnis nicht öffnen: " << path << std::endl; return 1; }

struct dirent* entry; while ((entry = readdir(dir)) != nullptr) { std::cout << entry->d_name << std::endl; }

closedir(dir); return 0;}


Wichtige Nuancen

  • Die Funktion readdir() gibt die Namen . (aktuelles Verzeichnis) und .. (übergeordnetes Verzeichnis) zurück. Normalerweise sollten diese übersprungen werden:
if (entry->d_name[0] == '.') continue;
  • Dieser Code **funktioniert nicht standardmäßig unter Windows**. Für Windows gibt es windows.h und FindFirstFile/FindNextFile (dazu später mehr).
  • Vorteile: Minimalismus, funktioniert ohne C++17. Nachteile: nicht plattformunabhängig, keine Filterung nach Dateityp.


Methode 2: Windows API — FindFirstFile und FindNextFile



Wenn Ihr Ziel Windows ist, vergessen Sie dirent.h. Verwenden Sie stattdessen die native WinAPI. Sie ist leistungsstark, aber der Code wird ausführlich.



Wie es funktioniert

  1. Sie rufen FindFirstFile mit einem Muster auf (z. B. "C:\\\\*").
  2. Sie erhalten ein Handle und den ersten Eintrag.
  3. In einer Schleife rufen Sie FindNextFile auf, bis 0 zurückgegeben wird.
  4. Sie schließen das Handle mit FindClose.


Beispiel: Dateiliste im Stammverzeichnis von Laufwerk C:

#include <iostream>#include <windows.h>

int main() { WIN32_FIND_DATA findFileData; HANDLE hFind = FindFirstFile("C:\\\\*", &findFileData);

if (hFind == INVALID_HANDLE_VALUE) { std::cerr << "Dateien konnten nicht gefunden werden (Fehlercode: " << GetLastError() << ")" << std::endl; return 1; }

do { // "." und ".." überspringen if (strcmp(findFileData.cFileName, ".") != 0 && strcmp(findFileData.cFileName, "..") != 0) { std::cout << findFileData.cFileName << std::endl; } } while (FindNextFile(hFind, &findFileData) != 0);

FindClose(hFind); return 0;}


Was wichtig zu wissen ist