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

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

42
demandé sur alk 2012-09-20 14:36:38

7 réponses

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

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. */
}
53
répondu hmjd 2012-09-20 10:38:31

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

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

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

    if (stat(folderr, &sb) == 0 && S_ISDIR(sb.st_mode))
    {
        printf("YES\n");
    }
    else
    {
        printf("NO\n");
    }
}
30
répondu Saman 2014-07-03 03:19:21

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

#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()");
14
répondu alk 2016-10-30 09:22:00

La meilleure façon est probablement d'essayer de l'ouvrir, en utilisant juste opendir() par exemple.

Notez qu'il est toujours préférable d'essayer de utiliser une ressource de système de fichiers, et de gérer toute erreur survenant car elle n'existe pas, plutôt que de simplement vérifier et ensuite essayer. Il y a une condition de concurrence évidente dans cette dernière approche.

8
répondu unwind 2012-09-20 10:38:23

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

bool isdir = S_ISDIR(st.st_mode);

Note de côté, je recommande D'utiliser Boost et / ou Qt4 pour faciliter le support multi-plateforme si votre logiciel peut être viable sur d'autres systèmes D'exploitation.

4
répondu TheFriendlyDragon 2014-01-15 22:45:24

, 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
répondu David C. Rankin 2018-08-12 08:46:08

Deux autres façons, peut-être moins correct est d'utiliser. La première, en utilisant uniquement des bibliothèques standard et pour les fichiers uniquement:

FILE *f;
f = fopen("file", "r")
if(!f)
   printf("there is no file there");

Celui - ci pourrait fonctionner sur tous les OS.

Ou un autre aussi pour dirs, en utilisant l'appel système avec system(). Est la pire option, mais vous donne une autre façon. Quelqu'un peut-être utile.

-5
répondu ferbuntu 2012-09-20 11:47:55