Comprobar si un archivo es un directorio o simplemente un archivo [duplicate]

3 minutos de lectura

avatar de usuario
jookia

Estoy escribiendo un programa para verificar si algo es un archivo o un directorio. ¿Hay una mejor manera de hacerlo que esto?

#include <stdio.h>

#include <sys/types.h>
#include <dirent.h>
#include <errno.h>

int isFile(const char* name)
{
    DIR* directory = opendir(name);

    if(directory != NULL)
    {
     closedir(directory);
     return 0;
    }

    if(errno == ENOTDIR)
    {
     return 1;
    }

    return -1;
}

int main(void)
{
    const char* file = "./testFile";
    const char* directory = "./";

    printf("Is %s a file? %s.\n", file,
     ((isFile(file) == 1) ? "Yes" : "No"));

    printf("Is %s a directory? %s.\n", directory,
     ((isFile(directory) == 0) ? "Yes" : "No"));

    return 0;
}

avatar de usuario
Frederic Hamidi

Puedes llamar al estadística() funcionar y usar el S_ISREG() macro en el st_mode campo de la estadística estructura para determinar si su ruta apunta a un archivo regular:

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

int is_regular_file(const char *path)
{
    struct stat path_stat;
    stat(path, &path_stat);
    return S_ISREG(path_stat.st_mode);
}

Tenga en cuenta que hay otros tipos de archivos además de regular y directoriocomo dispositivos, conductos, enlaces simbólicos, enchufes, etc. Es posible que desee tenerlos en cuenta.

  • Al considerar los casos de enlaces simbólicos, use lstat() en lugar de stat() ya que no sigue el enlace simbólico.

    – chispeante

    29 de diciembre de 2010 a las 12:13

  • Hay al menos una buena discusión en Comprobar si existe un directorio, donde stat() y lstat() se analizan y se describe el conjunto completo de tipos de archivos POSIX. Estoy tentado de duplicar esta pregunta a esa. El código debe comprobar el resultado de stat()también, y manejar los errores apropiadamente.

    –Jonathan Leffler

    13 de marzo de 2015 a las 22:49

  • @Jonathan, esa respuesta es más completa que la mía y se publicó tres meses antes que la mía, hace cinco años. Y no es como si mi propia respuesta desapareciera de todos modos. Veo que manejas Mjölnir en el [c] etiqueta, así que gracias por comentar antes de actuar unilateralmente. Sin embargo, al final tienes razón. No te preocupes, haz lo que tengas que hacer 🙂

    – Frederic Hamidi

    13 de marzo de 2015 a las 22:56

  • esto no funciona en osx para mí…

    – v0d1ch

    17/01/2016 a las 18:15

  • @vodish, tal vez stat() te esta fallando? ¿Qué pasa con el código en el duplicado, te funciona?

    – Frederic Hamidi

    17 de enero de 2016 a las 18:19

avatar de usuario
ismail

Utilizar el S_ISDIRmacro:

int isDirectory(const char *path) {
   struct stat statbuf;
   if (stat(path, &statbuf) != 0)
       return 0;
   return S_ISDIR(statbuf.st_mode);
}

  • Te olvidaste de llenar el statbuf estructura con información.

    – RojoX

    29 de diciembre de 2010 a las 9:52

  • Esto funciona bien tal como está, la función stat llena la información en sí.

    – ismail

    29 de diciembre de 2010 a las 9:54


  • Idealmente, el código comprobaría que stat trabajó: if (stat(path, &statbuf) != 0) return 0; — porque un objeto inexistente no es un directorio, y si no tiene permiso para stat() es posible que no exista (incluso si el error informado está relacionado con los permisos).

    –Jonathan Leffler

    13 de marzo de 2015 a las 22:48

  • @JonathanLeffler tienes toda la razón, actualizó el código.

    – ismail

    14/03/2015 a las 15:47

Sí, hay mejor. Comprobar el stat o la fstat función

avatar de usuario
R.. GitHub DEJAR DE AYUDAR A ICE

Normalmente, desea realizar esta verificación atómicamente con el resultado, por lo que stat() es inútil En lugar de, open() el archivo de solo lectura primero y use fstat(). Si es un directorio, puede usar fdopendir()

para leerlo O puede intentar abrirlo para escribir, y la apertura fallará si es un directorio. Algunos sistemas (POSIX 2008, Linux) también tienen un O_DIRECTORY extensión a open lo que hace que la llamada falle si el nombre no es un directorio.

Tu método con opendir() también es bueno si desea un directorio, pero no debe cerrarlo después; deberías seguir adelante y usarlo.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad