2012-02-16 25 views
20

Estoy usando la función opendir para verificar si existe un directorio. El problema es que lo estoy usando en un ciclo masivo y está inflando el ram utilizado por mi aplicación.C manera más rápida de verificar si existe un directorio

¿Cuál es la mejor (más rápida) forma de verificar si existe un directorio en C? ¿Cuál es la mejor forma (más rápida) de crearlo si no existe?

+7

Pregunta tonta, ¿estás llamando 'closedir()' luego? – user7116

+0

Y la forma más rápida podría ser hacerlo de forma asíncrona, pero debería considerar las capacidades de sus medios. Si es HDD regular, puede fallar en una tormenta de búsqueda y esto funcionará lentamente. Pero si usa RAID/SSD o incluso trabajando en la nube, esto funcionará. – LiMar

Respuesta

16

Puede llamar al mkdir(). Si el directorio no existe, se creará y se devolverá 0. Si el directorio existe, se devolverá -1 y errno se establecerá en EEXIST.

+2

Con la advertencia de que 'ENOENT' puede ocurrir si algo a lo largo del camino no existe también. – user7116

+0

Es cierto. Debería haber mencionado eso. – ckruse

+2

¿Es más rápido que la estadística? –

2

Yo usaría stat(), si está disponible.

39

Considere el uso de stat. S_ISDIR(s.st_mode) le dirá si es un directorio.

muestra:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

... 
struct stat s; 
int err = stat("/path/to/possible_dir", &s); 
if(-1 == err) { 
    if(ENOENT == errno) { 
     /* does not exist */ 
    } else { 
     perror("stat"); 
     exit(1); 
    } 
} else { 
    if(S_ISDIR(s.st_mode)) { 
     /* it's a dir */ 
    } else { 
     /* exists but is no dir */ 
    } 
} 
... 
+1

¿Qué tan rápido es la comparación con Opendir? –

+3

Eso depende del sistema operativo y del número de entradas que hay en el directorio principal. Será más rápido de cualquier manera y para eso está hecho 'stat'. –

+0

Linux 64 bits, 1 entrada –

0

Parece que usted tiene una pérdida de memoria. Llamar a opendir no debe inflar la memoria RAM de su aplicación siempre que recuerde llamar siempre a closedir después de abrir con éxito un directorio. Además, asegúrese de liberar todos los búferes que asignó para calcular el nombre del directorio.

+0

Yeap Lo estoy cerrando, solo usaré estadísticas, ¡gracias por su tiempo! –

16

Yo prefiero usar access()

if (0 != access("/path/to/possible_dir/", F_OK)) { 
    if (ENOENT == errno) { 
    // does not exist 
    } 
    if (ENOTDIR == errno) { 
    // not a directory 
    } 
} 

Si se asegura un arrastre / en el nombre del directorio, esto funciona perfectamente.

Cuestiones relacionadas