Sie können die anrufen stat() funktionieren und verwenden die S_ISREG() Makro auf dem st_mode Feld der Stat Struktur, um festzustellen, ob Ihr Pfad auf eine reguläre Datei zeigt:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int is_regular_file(const char *path)
{
struct stat path_stat;
stat(path, &path_stat);
return S_ISREG(path_stat.st_mode);
}
Beachten Sie, dass es daneben noch andere Dateitypen gibt regulär und Verzeichniswie Geräte, Pipes, symbolische Links, Sockets usw. Möglicherweise möchten Sie diese berücksichtigen.
Wenn Sie Symlink-Fälle in Betracht ziehen, verwenden Sie lstat() anstelle von stat(), da es nicht dem Symlink folgt.
– Funkelnd
29. Dezember 2010 um 12:13 Uhr
Es gibt zumindest eine gute Diskussion unter Überprüfen, ob ein Verzeichnis existiert, wo stat() und lstat() werden besprochen, und der vollständige Satz von POSIX-Dateitypen wird skizziert. Ich bin versucht, diese Frage mit dieser zu duplizieren. Der Code sollte das Ergebnis von überprüfen stat()und behandeln Sie Fehler angemessen.
– Jonathan Leffler
13. März 2015 um 22:49 Uhr
@Jonathan, diese Antwort ist in der Tat vollständiger als meine und wurde vor fünf Jahren drei Monate vor meiner gepostet. Und es ist nicht so, dass meine eigene Antwort sowieso verschwinden würde. Ich sehe, du schwingst Mjölnir in der [c] Tag, also vielen Dank für Ihren Kommentar, bevor Sie einseitig handeln. Letztendlich hast du jedoch Recht. Keine Sorge, tu was du tun musst 🙂
– Frédéric Hamidi
13. März 2015 um 22:56 Uhr
das funktioniert bei mir nicht unter osx…
– v0d1ch
17. Januar 2016 um 18:15 Uhr
@vodish, vielleicht stat() scheitert für dich? Was ist mit dem Code im Duplikat, funktioniert es für Sie?
– Frédéric Hamidi
17. Januar 2016 um 18:19 Uhr
ismail
Verwenden Sie die S_ISDIRMakro:
int isDirectory(const char *path) {
struct stat statbuf;
if (stat(path, &statbuf) != 0)
return 0;
return S_ISDIR(statbuf.st_mode);
}
Sie haben vergessen, das auszufüllen statbuf Struktur mit Informationen.
– RedX
29. Dezember 2010 um 9:52 Uhr
Dies funktioniert gut, wie es ist, die Stat-Funktion füllt die Informationen selbst aus.
– ismail
29. Dezember 2010 um 9:54 Uhr
Idealerweise würde der Code das überprüfen stat hat funktioniert: if (stat(path, &statbuf) != 0) return 0; — weil ein nicht vorhandenes Objekt kein Verzeichnis ist und Sie keine Berechtigung dazu haben stat() es kann genauso gut nicht existieren (selbst wenn der gemeldete Fehler mit Berechtigungen zusammenhängt).
– Jonathan Leffler
13. März 2015 um 22:48 Uhr
@JonathanLeffler Sie haben absolut Recht, den Code aktualisiert.
– ismail
14. März 2015 um 15:47 Uhr
Ja, es gibt Besseres. Überprüf den stat oder der fstat Funktion
R.. GitHub HÖREN SIE AUF, ICE ZU HELFEN
Normalerweise möchten Sie diese Überprüfung atomar durchführen, indem Sie das Ergebnis verwenden, also stat() ist nutzlos. Stattdessen, open() die Datei zuerst schreibgeschützt und verwenden fstat(). Wenn es sich um ein Verzeichnis handelt, können Sie dann verwenden fdopendir()
um es zu lesen. Oder Sie können versuchen, es zunächst zum Schreiben zu öffnen, und das Öffnen schlägt fehl, wenn es sich um ein Verzeichnis handelt. Einige Systeme (POSIX 2008, Linux) haben auch eine O_DIRECTORY Verlängerung zu open wodurch der Aufruf fehlschlägt, wenn der Name kein Verzeichnis ist.
Ihre Methode mit opendir() ist auch gut, wenn Sie ein Verzeichnis haben möchten, aber Sie sollten es danach nicht schließen; Sie sollten weitermachen und es verwenden.
14062600cookie-checkÜberprüfen, ob eine Datei ein Verzeichnis oder nur eine Datei ist [duplicate]yes