it-swarm.com.de

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

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

54
user1543915

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

#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. */
}
73
hmjd

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");
    }
}
34
Saman

Sie können stat() verwenden und die Adresse eines struct stat Übergeben. Überprüfen Sie dann das Element st_mode Auf die Einstellung von S_IFDIR.

#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()");
15
alk

Der beste Weg ist wahrscheinlich, es mit nur opendir() zu öffnen.

Beachten Sie, dass es immer am besten ist, zu versuchen, eine Dateisystemressource zu verwenden und alle Fehler zu behandeln, die auftreten, weil sie nicht vorhanden sind, anstatt sie nur zu überprüfen und später zu versuchen. Bei letzterem Ansatz liegt eine offensichtliche Rennbedingung vor.

8
unwind

Entsprechend man (2) stat können Sie das Makro S_ISDIR im Feld st_mode verwenden:

bool isdir = S_ISDIR(st.st_mode);

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

4

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

/* 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);
        } else {
            return -2; /* d exists, but not dir */
        }
    } else {
        return -1;     /* d does not exist */
    }

    return 1;
}
2
David C. Rankin