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 <iostream>
#include <vector>
#include <string>
#include <filesystem>

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

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 <iostream>
#include <vector>
#include <string>
#include <filesystem>

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

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 <iostream>
#include <vector>
#include <string>
#include <filesystem>

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

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 <iostream>
#include <vector>
#include <string>
#include <filesystem>

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

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 <iostream>
#include <vector>
#include <string>
#include <filesystem>

using std::cout; using std::cin;
using std::endl; using std::vector;
using std::filesystem::exists;
using std::filesystem::directory_iterator;
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;
}

Verwandter Artikel - C++ File

  • In eine Datei schreiben in C++
  • Wie man aus einer Datei in C++ einliest