2012-09-20 24 views
39

¿Cómo puedo verificar si existe un directorio en Linux en C?¿Cómo puedo verificar si existe un directorio?

+0

duplicado posible de [C manera más rápida para comprobar si existe un directorio] (http: // stackoverflow. com/questions/9314586/c-faster-way-to-check-if-a-directory-exists) –

Respuesta

44

Puede utilizar opendir() y comprobar si ENOENT == errno en caso de fallo:

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. */ 
} 
+5

Para usar esto, necesita '#include '. –

+0

Si la carpeta no existe, ¿cómo puedo crear una inmediatamente después de confirmar que no existe? – Pototo

+0

¿Está 'errno' incluido por defecto? Veo que está definido en '#include ' de acuerdo con las páginas man – peter

8

Probablemente la mejor forma de hacerlo sea intentar abrirlo, usando solo opendir() por ejemplo.

Tenga en cuenta que siempre es mejor intentar utilizar un recurso del sistema de archivos, y manejar cualquier error que ocurra porque no existe, en lugar de simplemente verificar y luego intentarlo. Hay una condición de carrera obvia en este último enfoque.

13

Es posible utilizar stat() y pasarlo la dirección de un struct stat, a continuación, comprobar su miembro st_mode por tener S_IFDIR conjunto.

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

Otras dos formas, quizás menos correctas, es utilizarlas. La primera de ellas, utilizando sólo las bibliotecas estándar y sólo para los archivos:

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

Esto se podría trabajar en todo el sistema operativo.

u otro también para dirs, utilizando la llamada al sistema system(). Es la peor opción, pero te da otra forma. Para alguien tal vez sea útil.

+2

La pregunta era específicamente sobre directorios, no archivos. Y va a recomendar llamar 'system()', debe especificar qué argumento pasarle. –

+2

"*' printf ("no hay archivo allí") '*": No poder abrir como archivo no significa necesariamente que no existe. Por esto, es posible que el código no pueda 'fopen()' un archivo existente, por ejemplo, debido a problemas de acceso a la derecha. – alk

4

Según man(2)stat puede utilizar la macro S_ISDIR en el campo st_mode:

bool isdir = S_ISDIR(st.st_mode); 

Nota al margen, yo recomendaría usar Boost y/o Qt4 para hacer soporte multiplataforma más fácil si su software puede ser viable en otros sistemas operativos.

24

Utilice el siguiente código para verificar si existe una carpeta. Funciona en ambas plataformas Windows & 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"); 
    } 
} 
+0

¿Estás seguro de que los encabezados incluidos son suficientes, al menos para Linux? – alk

1

También se puede utilizar en combinación con accessopendir para determinar si existe el directorio, y si existe el nombre, pero no es un directorio. Por ejemplo:

/* test that dir exists (1 success, -1 does not exist, -2 not dir) */ 
int 
xis_dir (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

Estoy de acuerdo que la siguiente cabecera son una de las mejores soluciones:

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

¿No necesitará algún código de acompañamiento con los encabezados para responder realmente la pregunta? –

+1

Esto no proporciona una respuesta a la pregunta. – alk

Cuestiones relacionadas