2012-12-19 5 views
7

Mögliche Duplizieren:
What’s the best way to check if a file exists in C? (cross platform)C, prüfen, ob eine Datei existiert, ohne dass man lesen/schreiben kann?

ich möchte überprüfen, ob eine Datei vorhanden ist oder nicht. Ich habe die Berechtigungen meiner Testdatei auf "chmod -r somefile" geändert. Jetzt sagt es aber, dass die Datei nicht existiert, obwohl sie existiert.

Also ich nehme an, wenn ich nicht Leseberechtigungen habe, kann ich die Datei mit "fopen r" nicht öffnen. Aber das würde bedeuten, dass es keinen einfachen Weg gibt zu sagen, ob eine Datei existiert oder nicht gelesen/geschrieben werden kann.

Oder fehlt mir etwas? Jede Hilfe wäre großartig.

Danke!

int doesFileExist(const char* filename) 
{ 
    FILE* fptr = fopen(filename, "r"); 
    if (fptr != NULL) 
    { 
    fclose(fptr); 
    printf("File exists\n"); 
    return 1; 
    } 
    printf("File doesnt exist\n"); 
    return 0; 
} 

Update: Danke Leute für diese tollen Links und Erklärungen!

+1

Um .. haben Sie geprüft 'errno'? EDIT: versuchen Sie dies, um eine Fehlermeldung zu erhalten: 'printf (" Datei existiert nicht:% s \ n ", strerror (errno));' Vergessen Sie nicht, 'errno.h'-Header einzubeziehen. – Jack

+0

Das ist es, was ich an der stdio-API hasse, wenn Sie etwas nicht-triviales machen wollen, wie die Größe einer Datei ändern oder eine Datei verschieben, ohne sie zu kopieren und zu löschen, haben Sie kein Glück in Bezug auf Portabilität. – Thomas

Antwort

18

fopen versucht tatsächlich, die Datei zu öffnen, was nicht möglich ist, wenn Sie keinen Lesezugriff haben. Um zu prüfen, ob die Datei existiert, ohne sie zu öffnen, verwenden Sie stat; stat gibt Ihnen Metadaten über die Datei und benötigt nur Lesezugriff auf das Verzeichnis, das die Datei enthält, nicht die Datei selbst.

int doesFileExist(const char *filename) { 
    struct stat st; 
    int result = stat(filename, &st); 
    return result == 0; 
} 

Sie könnten schicker erhalten, indem die Überprüfung errno wenn result nicht 0 ist; Wenn errno ist ENOENT dann ist die Datei nicht vorhanden, wenn es ENOTDIR dann Teil des von Ihnen angegebenen Pfads ist kein Verzeichnis, wenn es EACCESS dann Sie keine Leseberechtigung für eines der Verzeichnisse im Pfad und so stat kann Ich gebe dir keine Antwort und so weiter. Wenn Sie sich auf einer Plattform mit Symlinks (Unix-ähnlich oder Windows Vista oder höher) befinden, sollten Sie sich darüber im Klaren sein, ob Sie über den Symlink oder die Datei, auf die er verweist, etwas wissen sollten . Wenn Sie stat aufrufen, fragen Sie nach der Datei, auf die es zeigt; Wenn Sie einen Symlink dir/link haben, der auf other/file zeigt, dann gibt stat Ergebnisse über other/file zurück (was normalerweise das ist, was Sie wollen, denn das würden Sie bekommen, wenn Sie die Datei öffneten).Wenn Sie jedoch neugierig auf den Link selbst sind (wenn Sie wissen möchten, ob dir/link existiert, auch wenn other/file nicht?), Dann sollten Sie lstat() verwenden.

funktioniert auf Windows als Kompatibilitäts-Wrapper (sie bevorzugen Sie _stat() verwenden, und wird gewarnt, wenn Sie dies nicht tun), aber es ist im Allgemeinen besser, die nativen Plattform-APIs zu verwenden. Unter Windows sollten Sie wahrscheinlich GetFileAttributes() verwenden:

int doesFileExist(const char *filename) { 
    return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES; 
} 
-1

Unter Linux (und vielen anderen Systemen) können Sie opendir() und Freunde verwenden, um Verzeichnisse aufzulisten. Ich denke, schreibgeschützte Dateien werden angezeigt. Auf anderen Plattformen sollten ähnliche Funktionen verfügbar sein.

1

Sie überprüfen nicht wirklich, ob die Datei hier existiert ... Sie überprüfen, ob Sie sie mit Lesezugriff öffnen können. Es könnte aus anderen Gründen als der Datei fehlschlagen. Wie Sie gesehen haben, haben Sie möglicherweise keine Leseberechtigung. Es könnte auch sein, dass die Datei gesperrt ist.

prüfen diese Antwort:

What's the best way to check if a file exists in C? (cross platform)

Er schlägt vor, stat verwenden, die in den meisten Fällen, außer arbeiten sollten, wenn Sie keinen Zugriff auf das Verzeichnis gelesen haben, in dem sich die Datei befindet.