Wie man prüft ob eine Datei in C++ existiert

Jinku Hu 12 Oktober 2023
Wie man prüft ob eine Datei in C++ existiert

Dieser Artikel stellt C++-Methoden vor, mit denen überprüft werden kann, ob eine bestimmte Datei in einem Verzeichnis existiert. Beachten Sie jedoch, dass das folgende Tutorial auf der C++ 17 filesystem-Bibliothek basiert, die nur von neuen Compilern unterstützt wird.

Verwenden Sie std::filesystem::exists, um zu prüfen, ob eine Datei in einem Verzeichnis existiert

Die Methode exists nimmt einen Pfad als Argument und gibt den booleschen Wert true zurück, wenn er einer existierenden Datei oder einem existierenden Verzeichnis entspricht. Im folgenden Beispiel initialisieren wir einen Vektor mit willkürlichen Dateinamen, um sie im Dateisystem mit exists-Funktionen zu überprüfen. Beachten Sie, daß die exists-Methode nur das aktuelle Verzeichnis überprüft, in dem sich die ausführbare Datei befindet.

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::filesystem::exists;

int main() {
  vector<string> files_to_check = {"main.cpp", "Makefile", "hello-world"};

  for (const auto &file : files_to_check) {
    exists(file) ? cout << "Exists\n" : cout << "Doesn't exist\n";
  }

  return EXIT_SUCCESS;
}

Der obige Code kann mit dem for_Each STL-Algorithmus reimplementiert werden, was eine bessere Wiederverwendbarkeit des Codes ermöglicht:

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::filesystem::exists;

int main() {
  vector<string> files_to_check = {"main.cpp", "Makefile", "hello-world"};

  auto check = [](const auto &file) {
    exists(file) ? cout << "Exists\n" : cout << "Doesn't exist\n";
  };

  for_each(files_to_check.begin(), files_to_check.end(), check);

  return EXIT_SUCCESS;
}

Die exists Methode kann informativer sein, wenn sie mit anderen <filesystem> Bibliotheksroutinen wie is_directory und is_regular_file. Im Allgemeinen unterscheiden einige Dateisystem-Methoden nicht zwischen Dateien und Verzeichnissen, aber wir können spezielle Dateityp-Prüffunktionen verwenden, um Pfadnamen zu verifizieren, wie im folgenden Beispielcode gezeigt wird:

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::filesystem::exists;
using std::filesystem::is_directory;
using std::filesystem::is_regular_file;

int main() {
  vector<string> files_to_check = {"main.cpp", "Makefile", "hello-world"};

  for (const auto &file : files_to_check) {
    if (exists(file)) {
      if (is_directory(file)) cout << "Directory exists\n";
      if (is_regular_file(file))
        cout << "File exists\n";
      else
        cout << "Exists\n";
    } else {
      cout << "Doesn't exist\n";
    };
  };

  return EXIT_SUCCESS;
}

Betrachten wir nun einen Fall, in dem wir zu einem bestimmten Verzeichnis navigieren und nach einem bestimmten Dateinamen suchen wollen, falls dieser existiert. Dazu müssen wir die current_path-Methode verwenden, die das aktuelle Verzeichnis zurückgibt, wenn kein Argument übergeben wird, oder es kann in ein Verzeichnis wechseln, wenn das Pfad-Argument angegeben wird. Vergessen Sie nicht, den Verzeichnispfad und die Dateinamen basierend auf Ihrem System zu ändern, um die Programmausgabe besser überprüfen zu können:

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::filesystem::current_path;
using std::filesystem::exists;
using std::filesystem::is_directory;
using std::filesystem::is_regular_file;

int main() {
  vector<string> files_to_check = {"main.cpp", "Makefile", "hello-world"};
  current_path("../");
  for (const auto &file : files_to_check) {
    exists(file) ? cout << "Exists\n" : cout << "Doesn't exist\n";
  }

  return EXIT_SUCCESS;
}

Man kann auch überprüfen, welche Berechtigungen der aktuelle Benutzer auf Dateien in einem Verzeichnis während der Iteration durch directory_iterator hat. Die status-Methode wird verwendet, um Berechtigungen zu erhalten und sie in einer speziellen Klasse namens perms zu speichern. Die abgerufenen Berechtigungen können mit bitweisen Operationen auf der perms-Struktur angezeigt werden. Das folgende Beispiel zeigt nur die Extraktion von Eigentümer-Berechtigungen (siehe die vollständige Liste hier).

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::filesystem::directory_iterator;
using std::filesystem::exists;
using std::filesystem::perms;

using std::string;

int main() {
  vector<std::filesystem::perms> f_perm;
  string path = "../";

  for (const auto& file : directory_iterator(path)) {
    cout << file << " - ";
    cout << ((file.status().permissions() & perms::owner_read) != perms::none
                 ? "r"
                 : "-")
         << ((file.status().permissions() & perms::owner_write) != perms::none
                 ? "w"
                 : "-")
         << ((file.status().permissions() & perms::owner_exec) != perms::none
                 ? "x"
                 : "-")
         << endl;
  }
  cout << 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