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