642 Stimmen

Der schnellste Weg, um zu prüfen, ob eine Datei mit Standard-C++/C++11,14,17/C existiert?

Ich möchte den schnellsten Weg finden, um zu prüfen, ob eine Datei in Standard C++11, 14, 17 oder C existiert. Ich habe Tausende von Dateien und bevor ich etwas mit ihnen mache, muss ich prüfen, ob sie alle existieren. Was kann ich anstelle von /* SOMETHING */ in der folgenden Funktion?

inline bool exist(const std::string& name)
{
    /* SOMETHING */
}

3voto

In C++17 :

#include <experimental/filesystem>

bool is_file_exist(std::string& str) {   
    namespace fs = std::experimental::filesystem;
    fs::path p(str);
    return fs::exists(p);
}

3voto

John Punkte 111
all_of (begin(R), end(R), [](auto&p){ exists(p); })

donde R ist Ihre Abfolge von pfadähnlichen Dingen, und exists() aus dem zukünftigen Standard oder der aktuellen Erhöhung stammt. Wenn Sie Ihre eigene Rolle, halten Sie es einfach,

bool exists (string const& p) { return ifstream{p}; }

Die verzweigte Lösung ist nicht absolut schrecklich und verschlingt keine Dateideskriptoren,

bool exists (const char* p) {
    #if defined(_WIN32) || defined(_WIN64)
    return p && 0 != PathFileExists (p);
    #else
    struct stat sb;
    return p && 0 == stat (p, &sb);
    #endif
}

1voto

KoopTheKoopa Punkte 11

Hier ist ein einfaches Beispiel!

#include <iostream>
#include <fstream>
using namespace std;

void main(){
   SearchFile("test.txt");
}

bool SearchFile(const char *file)
{
   ifstream infile(file);
   if (!infile.good())
   {
    // If file is not there
    exit(1);
   }
}

0voto

Andy Bantly Punkte 11

Mit MFC ist dies wie folgt möglich

CFileStatus FileStatus;
BOOL bFileExists = CFile::GetStatus(FileName,FileStatus);

Wo FileName ist eine Zeichenkette, die die zu prüfende Datei darstellt

0voto

Imad Diraa Punkte 1

Es gibt nur einen schnelleren Weg, um zu prüfen, ob die Datei existiert und ob Sie die Erlaubnis haben, sie zu lesen, nämlich den Weg über die Sprache C. Dieser Weg ist schneller und kann auch in jeder Version von C++ verwendet werden.

Lösung : In C gibt es eine Bibliothek errno.h die eine externe (globale) Integer-Variable namens errno hat, die eine Zahl enthält, die zur Erkennung der Art des Fehlers verwendet werden kann

    #include <stdio.h>
    #include <stdbool.h>
    #include <errno.h>

    bool isFileExist(char fileName[]) {
        FILE *fp = fopen(fileName, "r");
        if (fp) {
            fclose(fp);
            return true;
        }
        return errno != ENOENT;
    }

    bool isFileCanBeRead(char fileName[]) {
        FILE *fp = fopen(fileName, "r");
        if (fp) {
            fclose(fp);
            return true;
        }
        return errno != ENOENT && errno != EPERM;
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X