web-dev-qa-db-fra.com

Comment puis-je vérifier si un répertoire existe?

Comment puis-je vérifier si un répertoire existe sous Linux en C?

54
user1543915

Vous pouvez utiliser opendir() et vérifier si ENOENT == errno en cas d'échec:

#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

Utilisez le code suivant pour vérifier si un dossier existe. Cela fonctionne sur les plates-formes Windows et Linux.

#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

Vous pouvez utiliser stat() et lui transmettre l'adresse d'un struct stat, puis vérifiez son membre st_mode pour avoir S_IFDIR ensemble.

#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

Le meilleur moyen est probablement d'essayer de l'ouvrir, en utilisant seulement opendir() par exemple.

Notez qu'il est toujours préférable d'essayer de tiliser une ressource de système de fichiers et de gérer les erreurs éventuelles car elles n'existent pas, plutôt que de simplement vérifier, puis d'essayer plus tard. Il existe une condition de concurrence évidente dans la dernière approche.

8
unwind

Selon man (2) stat , vous pouvez utiliser la macro S_ISDIR sur le champ st_mode:

bool isdir = S_ISDIR(st.st_mode);

Remarque secondaire, je vous recommanderais d'utiliser Boost et/ou Qt4 pour faciliter la prise en charge multi-plateformes si votre logiciel peut être viable sur d'autres systèmes d'exploitation.

4
TheFriendlyDragon

Vous pouvez également utiliser access en combinaison avec opendir pour déterminer si le répertoire existe et, si le nom existe, mais n’est pas un répertoire. Par exemple:

/* 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