Überprüfen, ob eine Datei ein Verzeichnis oder nur eine Datei ist [duplicate]

Lesezeit: 3 Minuten

Jookias Benutzeravatar
Jookia

Ich schreibe ein Programm, um zu überprüfen, ob etwas eine Datei oder ein Verzeichnis ist. Gibt es einen besseren Weg, dies zu tun?

#include <stdio.h>

#include <sys/types.h>
#include <dirent.h>
#include <errno.h>

int isFile(const char* name)
{
    DIR* directory = opendir(name);

    if(directory != NULL)
    {
     closedir(directory);
     return 0;
    }

    if(errno == ENOTDIR)
    {
     return 1;
    }

    return -1;
}

int main(void)
{
    const char* file = "./testFile";
    const char* directory = "./";

    printf("Is %s a file? %s.\n", file,
     ((isFile(file) == 1) ? "Yes" : "No"));

    printf("Is %s a directory? %s.\n", directory,
     ((isFile(directory) == 0) ? "Yes" : "No"));

    return 0;
}

Benutzeravatar von Frédéric Hamidi
Frédéric Hamidi

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

Benutzeravatar von ismail
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 STOP HELPING ICEs Benutzeravatar
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.

1406260cookie-checkÜberprüfen, ob eine Datei ein Verzeichnis oder nur eine Datei ist [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy