Comprobando si existe un directorio en Unix (llamada al sistema)

No puedo encontrar una solución a mi problema en línea.

Me gustaría llamar a una función en Unix, pasar por la ruta de un directorio y saber si existe. opendir() devuelve un error si un directorio no existe, pero mi objective no es abrir realmente, verificar el error, cerrarlo si no hay ningún error, sino simplemente verificar si un archivo es un directorio o no.

¿Hay alguna forma conveniente de hacerlo, por favor?

Hay dos funciones relevantes en los sistemas POSIX: stat () y lstat () . Estos se utilizan para averiguar si un nombre de ruta hace referencia a un objeto real al que tiene permiso de acceso, y si es así, los datos devueltos le dicen qué tipo de objeto es. La diferencia entre stat() y lstat() es que si el nombre que das es un enlace simbólico, stat() sigue el enlace simbólico (o enlaces si están encadenados) e informa sobre el objeto al final de la cadena de enlaces, mientras que lstat() informa sobre el enlace simbólico en sí.

 #include  struct stat sb; if (stat(pathname, &sb) == 0 && S_ISDIR(sb.st_mode)) { ...it is a directory... } 

Si la función indica que fue exitosa, usa la macro S_ISDIR () de para determinar si el archivo es realmente un directorio.

También puede verificar otros tipos de archivos usando otras macros S_IS* :

  • S_ISDIR – directorio
  • S_ISREG – archivo regular
  • S_ISCHR – dispositivo de caracteres
  • S_ISBLK – dispositivo de bloque
  • S_ISFIFO – FIFO
  • S_ISLNK – enlace simbólico
  • S_ISSOCK – socket

(Algunos sistemas también proporcionan algunos otros tipos de archivos; S_ISDOOR está disponible en Solaris, por ejemplo).

Puede hacer uso de la llamada al sistema stat pasándole el nombre del directorio como primer argumento. Si el directorio existe, se devuelve 0 se devuelve else -1 y errno se establecerá en ENOENT

EDITAR:

Si el valor de retorno es 0 , necesitaría una verificación adicional para asegurarse de que el argumento sea realmente un directorio y no un archivo / archivo especial / archivo especial / archivo especial / archivo FIFO. Puede hacer uso del campo st_mode de la stat structure para esto.

Podría usar test -d

Si está hablando de un shell, hay una buena respuesta SO aquí. Para resumir esa respuesta:

 if [ -d "$DIRECTORY" ]; then # Control will enter here if $DIRECTORY exists fi 

Si está hablando desde dentro de un progtwig C, puede usar stat() :

 { struct stat st; if(stat("/tmp",&st) == 0) printf(" /tmp is present\n"); } 

Si realmente no le importa el tipo de este objeto del sistema de archivos, el acceso (nombre, F_OK) comprueba la existencia de algo con este nombre. Si necesita asegurarse de que se trata de un directorio, use stat () y compruebe el tipo con la macro S_ISDIR ().

Probado y funcionando bien:

 int file_exist (char *filename) { char s[200]; sprintf(s, "test -e %s", filename); if (system(s) == 0){ return 1; }else{ return 0; } } 

Otra forma simple sería:

 int check(unsigned const char type) { if(type == DT_REG) return 1; if(type == DT_DIR) return 0; return -1; } 

A continuación, puede pasar el tipo d_type de struct dirent * para verificar la función.

Si check devuelve 1, esa ruta apunta al archivo normal.

Si la comprobación devuelve 0, esa ruta apunta a un directorio.

De lo contrario, no es un archivo o un directorio (puede ser un Dispositivo de Bloque / Enlace Simbólico, etc.)

Creo que la función stat puede hacer lo que quieras (no lo he probado para directorios). En C ++, también puede usar la biblioteca boost :: filesystem.