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 VerzeichnissenDIR *dir— ein Zeiger auf den Verzeichnisstromstruct 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.hundFindFirstFile/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
- Sie rufen
FindFirstFilemit einem Muster auf (z. B."C:\\\\*"). - Sie erhalten ein Handle und den ersten Eintrag.
- In einer Schleife rufen Sie
FindNextFileauf, bis 0 zurückgegeben wird. - 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
- In
WIN32_FIND_DATAgibt es das FelddwFileAttributesBlogs
Buchempfehlungen
Lesen Sie auch
Wie man in 30 Minuten eine REST API in Rust schreibt: für Anfänger
Clean Code in PHP: Prinzipien und Beispiele für sauberen Code
KI-Entwicklung heute und morgen: Klassische Mathematik reicht nicht mehr aus
Logging in Rust-Anwendungen: Best Practices und Tools
Verwendung von using innerhalb oder außerhalb des Namespace? Auswirkungen auf die Leistung von C#