Wie man eine Liste von Dateien in Verzeichnis C++ erhält

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie std::filesystem::directory_iterator, um eine Liste von Dateien in einem Verzeichnis zu erhalten
  2. Verwenden Sie opendir/readdir-Funktionen, um eine Liste von Dateien in einem Verzeichnis zu erhalten
  3. Verwenden Sie std::filesystem::recursive_directory_iterator, um eine Liste von Dateien in allen Unterverzeichnissen zu erhalten
Wie man eine Liste von Dateien in Verzeichnis C++ erhält

In diesem Artikel stellen wir Möglichkeiten vor, eine Liste von Dateien in einem bestimmten Verzeichnis zu erhalten.

Verwenden Sie std::filesystem::directory_iterator, um eine Liste von Dateien in einem Verzeichnis zu erhalten

Diese Methode ist Teil der in C++17 hinzugefügten <filesystem> Bibliothek. Beachten Sie, dass einige ältere Compiler möglicherweise keine Unterstützung für diese Methode haben, aber dies ist die native C++-Lösung für dieses Problem. directory_iterator wird in einer bereichsbasierten for-Schleife verwendet und nimmt den Pfad zum Verzeichnis als Argument. In diesem Beispiel geben wir einen Pfad zum Stammverzeichnis an, aber Sie sollten diese Variable auf der Basis Ihres Systems modifizieren, um einen gültigen Namen zu übergeben.

#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;
}

Ausgabe (Hängt vom Verzeichnis ab):

Archive2| lib| .| ..| lib64| Archive| dev| var| bin| usr| etc| tmp| proc|

Verwenden Sie opendir/readdir-Funktionen, um eine Liste von Dateien in einem Verzeichnis zu erhalten

Diese Methode ist viel wortreicher, aber sie ist eine zuverlässige Alternative für die Manipulation des Dateisystems.

Um die Funktionen opendir/readdir zu benutzen, sollten Sie die Header-Datei dirent.h einbinden.

opendir öffnet ein durch seinen Namen spezifiziertes Verzeichnis und gibt seinen Zeiger zurück, der auf DIR* steht.

readdir arbeitet mit dem Argument DIR* und gibt eine spezielle Struktur namens dirent zurück (siehe vollständige Info).

Sobald wir den readdir-Aufruf in eine while-Schleife setzen und mit nullptr vergleichen, fungiert er als Verzeichnis-Iterator, und wir können Zugriff auf Dateinamen durch jede zurückgegebene dirent-Struktur erhalten.

#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;
}

Beachten Sie, dass viele if-Anweisungen als Ausnahmebehandlungsmechanismen fungieren, da opendir- und readdir-Funktionen NULL-Zeiger bei Fehler/Ende des Verzeichnisses zurückgeben.

Verwenden Sie std::filesystem::recursive_directory_iterator, um eine Liste von Dateien in allen Unterverzeichnissen zu erhalten

Diese Methode ist nützlich, wenn mehrere Unterverzeichnisse nach bestimmten Dateinamen durchsucht werden sollen. Die Methode bleibt die gleiche wie directory_iterator. Sie müssen sie nur in einer Schleife mit einer bereichsbasierten Schleife durchlaufen und die Dateien nach Bedarf bearbeiten:

#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;
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C++ File