Wie kann ich überprüfen, ob ein Verzeichnis existiert?

Lesezeit: 3 Minuten

Benutzeravatar von user1543915
Benutzer1543915

Wie kann ich überprüfen, ob ein Verzeichnis unter Linux in C vorhanden ist?

  • Mögliches Duplikat von C, um schneller zu überprüfen, ob ein Verzeichnis existiert

    – patryk.beza

    22. Dezember 2016 um 11:50 Uhr

  • Beantwortet das deine Frage? Überprüfen, ob ein Verzeichnis in Unix existiert (Systemaufruf)

    – MasterHD

    19. Januar 2021 um 10:40 Uhr

Benutzeravatar von hmjd
hmjd

Sie können verwenden opendir() und prüfen ob ENOENT == errno bei Ausfall:

#include <dirent.h>
#include <errno.h>

DIR* dir = opendir("mydir");
if (dir) {
    /* Directory exists. */
    closedir(dir);
} else if (ENOENT == errno) {
    /* Directory does not exist. */
} else {
    /* opendir() failed for some other reason. */
}

  • Wenn der Ordner nicht existiert, wie kann ich dann sofort einen erstellen, nachdem ich bestätigt habe, dass er nicht existiert?

    – Kartoffel

    20. April 2017 um 18:15 Uhr

  • Falls Sie Visual Studio verwenden, dirent.h nicht verfügbar ist, siehe diesen SO-Beitrag für Alternativen

    – gezzakopf

    9. April 2018 um 8:49 Uhr


Samans Benutzeravatar
Saman

Verwenden Sie den folgenden Code, um zu überprüfen, ob ein Ordner vorhanden ist. Es funktioniert sowohl auf Windows- als auch auf Linux-Plattformen.

#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char* argv[])
{
    const char* folder;
    //folder = "C:\\Users\\SaMaN\\Desktop\\Ppln";
    folder = "/tmp";
    struct stat sb;

    if (stat(folder, &sb) == 0 && S_ISDIR(sb.st_mode)) {
        printf("YES\n");
    } else {
        printf("NO\n");
    }
}

  • Sind Sie sicher, dass die enthaltenen Header zumindest für Linux ausreichen?

    – alk

    22. Mai 2017 um 19:05 Uhr


  • S_ISDIR ist nur für POSIX, nicht für Windows, siehe diesen SO-Beitrag

    – gezzakopf

    9. April 2018 um 8:45 Uhr


Benutzeravatar von alk
alk

Sie könnten verwenden stat() und übergebe ihr die Adresse von a struct statund überprüfen Sie dann sein Mitglied st_mode um zu haben S_IFDIR einstellen.

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

...

char d[] = "mydir";

struct stat s = {0};

if (!stat(d, &s))
  printf("'%s' is %sa directory.\n", d, (s.st_mode & S_IFDIR)  : "" ? "not ");
  // (s.st_mode & S_IFDIR) can be replaced with S_ISDIR(s.st_mode)
else
  perror("stat()");

  • Ich habe mich gefragt S_IFDIR vs S_ISDIR und fand dies auf der stat Manpage: „POSIX.1-1990 hat die Konstanten S_IFMT, S_IFSOCK, S_IFLNK, S_IFREG, S_IFBLK, S_IFDIR, S_IFCHR, S_IFIFO, S_ISVTX nicht beschrieben, sondern stattdessen die Verwendung der Makros S_ISDIR() usw. gefordert. Die S_IF*-Konstanten sind in vorhanden POSIX.1-2001 und später.”

    – Domson

    25. Mai 2021 um 8:28 Uhr

  • (s.st_mode & S_IFDIR) : "" ? "not " Du scheinst das verwechselt zu haben ? und :

    – Benutzer16217248

    6. August 2021 um 22:28 Uhr

Der beste Weg ist wahrscheinlich der Versuch, es zu öffnen, indem Sie einfach verwenden opendir() zum Beispiel.

Beachten Sie, dass es immer am besten ist, es zu versuchen verwenden B. eine Dateisystemressource, und behandeln Sie alle Fehler, die auftreten, weil sie nicht existiert, anstatt sie nur zu überprüfen und später zu versuchen. Beim letzteren Ansatz gibt es eine offensichtliche Wettlaufbedingung.

Entsprechend Mann(2)stat Sie können das Makro S_ISDIR für das Feld st_mode verwenden:

bool isdir = S_ISDIR(st.st_mode);

Randbemerkung: Ich würde empfehlen, Boost und/oder Qt4 zu verwenden, um die plattformübergreifende Unterstützung zu vereinfachen, wenn Ihre Software auf anderen Betriebssystemen funktionsfähig ist.

Benutzeravatar von pevik
pevik

Sie können auch verwenden access in Kombination mit opendir um festzustellen, ob das Verzeichnis existiert, und ob der Name existiert, aber kein Verzeichnis ist. Zum Beispiel:

#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>

/* test that dir exists (1 success, -1 does not exist, -2 not dir) */
int
xis_dir (const char *d)
{
    DIR *dirptr;

    if (access ( d, F_OK ) != -1 ) {
        // file exists
        if ((dirptr = opendir (d)) != NULL) {
            closedir (dirptr); /* d exists and is a directory */
        } else {
            return -2; /* d exists but is not a directory */
        }
    } else {
        return -1;     /* d does not exist */
    }

    return 1;
}

1417810cookie-checkWie kann ich überprüfen, ob ein Verzeichnis existiert?

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

Privacy policy