Comment puis-je vérifier si un répertoire existe sous Linux en C?
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. */
}
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");
}
}
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()");
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.
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.
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;
}