it-swarm.com.de

Wie kann am besten überprüft werden, ob eine Datei in C ++ vorhanden ist? (plattformübergreifend)

Ich habe die Antworten gelesen für Wie kann ich am besten überprüfen, ob eine Datei in C existiert? (Plattformübergreifend) , aber ich frage mich, ob es eine bessere Möglichkeit gibt, dies mit Standard-c ++ - Bibliotheken zu tun? Am besten ohne zu versuchen, die Datei überhaupt zu öffnen.

Sowohl stat als auch access sind ziemlich undurchsichtig. Was sollte ich #include um diese zu benutzen?

95
c0m4

Verwende boost :: filesystem :

#include <boost/filesystem.hpp>

if ( !boost::filesystem::exists( "myfile.txt" ) )
{
  std::cout << "Can't find my file!" << std::endl;
}
158

Seien Sie vorsichtig mit den Rennbedingungen: Wenn die Datei zwischen der Prüfung "Besteht" und dem Zeitpunkt, zu dem Sie sie öffnen, verschwindet, schlägt Ihr Programm unerwartet fehl.

Es ist besser, die Datei zu öffnen, auf Fehler zu prüfen und wenn alles in Ordnung ist, etwas mit der Datei zu tun. Bei sicherheitskritischem Code ist dies sogar noch wichtiger.

Details zu Sicherheit und Wettkampfbedingungen: http://www.ibm.com/developerworks/library/l-sprace.html

41
rlerallut

Ich bin ein glücklicher Boost-User und würde auf jeden Fall Andreas 'Lösung nutzen. Wenn Sie jedoch keinen Zugriff auf die Boost-Bibliotheken hatten, können Sie die Stream-Bibliothek verwenden:

ifstream file(argv[1]);
if (!file)
{
    // Can't open file
}

Es ist nicht ganz so schön wie boost :: filesystem ::, da die Datei tatsächlich geöffnet wird ... aber das ist normalerweise das nächste, was Sie sowieso tun möchten.

30
MattyT

Verwenden Sie stat (), wenn es für Ihre Anforderungen plattformübergreifend genug ist. Es ist jedoch kein C++ - Standard, sondern POSIX.

Unter MS Windows gibt es _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64.

11
activout.se

Eine andere Möglichkeit besteht darin, die Funktion good() im Stream zu verwenden:

#include <fstream>     
bool checkExistence(const char* filename)
{
     ifstream Infield(filename);
     return Infield.good();
}
9
Samer

Wie wäre es mit access?

#include <io.h>

if (_access(filename, 0) == -1)
{
    // File does not exist
}
9
Rob

Ich würde es mir überlegen, herauszufinden, ob eine Datei existiert. Sie sollten stattdessen versuchen, es (in Standard C oder C++) in demselben Modus zu öffnen, in dem Sie es verwenden möchten. Was nützt es, zu wissen, dass die Datei vorhanden ist, wenn sie beispielsweise nicht beschreibbar ist, wenn Sie sie verwenden müssen?

7
fizzer

Wenn Ihr Compiler C++ 17 unterstützt, brauchen Sie keinen Boost, sondern können einfach std::filesystem::exists

#include <iostream> // only for std::cout
#include <filesystem>

if (!std::filesystem::exists("myfile.txt"))
{
    std::cout << "File not found!" << std::endl;
}
3
AlbertM

NEIN Boost ERFORDERLICH , das wäre ein Overkill.


Verwenden Sie stat () (nicht plattformübergreifend, wie von pavon erwähnt), wie folgt:

#include <sys/stat.h>
#include <iostream>

// true if file exists
bool fileExists(const std::string& file) {
    struct stat buf;
    return (stat(file.c_str(), &buf) == 0);
}

int main() {
    if(!fileExists("test.txt")) {
        std::cerr << "test.txt doesn't exist, exiting...\n";
        return -1;
    }
    return 0;
}

Ausgabe:

C02QT2UBFVH6-lm:~ gsamaras$ ls test.txt
ls: test.txt: No such file or directory
C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp
C02QT2UBFVH6-lm:~ gsamaras$ ./a.out
test.txt doesn't exist, exiting...

Eine andere Version (und das) kann gefunden werden hier .

3
gsamaras

Wenn Sie bereits die Eingabedateistreamklasse (ifstream) verwenden, können Sie deren Funktion fail() verwenden.

Beispiel:

ifstream myFile;

myFile.open("file.txt");

// Check for errors
if (myFile.fail()) {
    cerr << "Error: File could not be found";
    exit(1);
}
0
Reza Saadati