Ich habe die Antworten für Wie kann ich am besten überprüfen, ob eine Datei in C vorhanden ist? (plattformübergreifend) , aber ich frage mich, ob es einen besseren Weg gibt, dies mit Standard-C ++ - Bibliotheken zu tun. Am besten ohne zu versuchen, die Datei überhaupt zu öffnen.
Beide stat
und access
sind so gut wie unaussprechlich. Was soll ich verwenden #include
, um diese zu verwenden?
Antworten:
Verwenden Sie boost :: filesystem :
quelle
Achten Sie auf die Rennbedingungen: Wenn die Datei zwischen der Prüfung "vorhanden" und dem Zeitpunkt des Öffnens 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 Rennbedingungen: http://www.ibm.com/developerworks/library/l-sprace.html
quelle
Ich bin ein glücklicher Boost-Benutzer und würde auf jeden Fall die Lösung von Andreas verwenden. Wenn Sie jedoch keinen Zugriff auf die Boost-Bibliotheken hatten, können Sie die Stream-Bibliothek verwenden:
Es ist nicht ganz so schön wie boost :: filesystem :: existiert, da die Datei tatsächlich geöffnet wird ... aber dann ist das normalerweise das nächste, was Sie sowieso tun möchten.
quelle
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.
quelle
Wie wäre es mit
access
?quelle
Eine andere Möglichkeit besteht darin, die
good()
Funktion im Stream zu verwenden:quelle
Ich würde es mir noch einmal überlegen, ob eine Datei existiert. Stattdessen sollten Sie 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 existiert, wenn sie beispielsweise nicht beschreibbar ist, wenn Sie sie verwenden müssen?
quelle
ls
ähnliches Programm schreiben ? Ich vermute, das Originalposter hier möchte die Datei überhaupt nicht öffnen. Die stat-Funktion von Posix soll Ihnen jedoch Informationen über die Berechtigungen der Datei geben, damit das Problem behoben wird.Wenn Ihr Compiler C ++ 17 unterstützt, benötigen Sie keinen Boost. Sie können ihn einfach verwenden
std::filesystem::exists
quelle
NEIN BoostERFORDERLICH , was ein Overkill wäre .
Verwenden Sie stat () (jedoch nicht plattformübergreifend, wie von pavon erwähnt) wie folgt:
Ausgabe:
Eine andere Version (und das) finden Sie hier .
quelle
Wenn Sie bereits die Eingabedateistreamklasse (
ifstream
) verwenden, können Sie deren Funktion verwendenfail()
.Beispiel:
quelle