2011-04-21 29 views
14

En un proyecto que tengo que hacer en el estándar C89 tengo que verificar si existe un archivo. ¿Cómo hago esto?C compruebe si el archivo existe

I pensado en utilizar

FILE *file; 
if ((file = fopen(fname, "r")) == NULL) 
{ 
    printf("file doesn't exists"); 
} 
return 0; 

pero creo que no puede haber más casos continuación, el archivo no existe que hará fopen == NULL.

¿Cómo puedo hacer esto? Prefiero no incluir incluye en lugar de.

+1

si 'fopen()' falla (es decir, devuelve '0') no es necesario (¡no se puede!) Cerrar el manejador del archivo. Tendrás que hacerlo si tienes éxito. – Mario

+1

No creo que haya una mejor manera en el estándar C89. Si permite POSIX u otras normas, consulte http://stackoverflow.com/questions/230062/whats-the-best-way-to-check-if-a-file-exists-in-c-cross-platform – interjay

Respuesta

14

Si no puede usar stat() en su entorno (que definitivamente es el mejor enfoque), simplemente evalúe errno. No olvides incluir errno.h.

FILE *file; 
if ((file = fopen(fname, "r")) == NULL) { 
    if (errno == ENOENT) { 
    printf("File doesn't exist"); 
    } else { 
    // Check for other errors too, like EACCES and EISDIR 
    printf("Some other error occured"); 
    } 
} else { 
    fclose(file); 
} 
return 0; 

Editar: se olvidó de envolver fclose en una cosa

+0

- 1 para ENOENT, 'ENOENT' no es parte del C89 estándar como el OP solicitado, su implementación está definida y no garantiza que exista. C89: "La implementación también puede especificar definiciones macro adicionales, comenzando con E y un dígito o E y una letra mayúscula". – Wiz

+0

Tiene razón, esto no está en el estándar (y con buenas razones, supongo). Si el código debe ser 100% portátil para todas las implementaciones C89, esta no es la forma correcta de hacerlo.Por otro lado, el soporte para ENOENT está ampliamente disponible, por lo que generalmente no es una mala idea utilizar el enfoque anterior. A menos que su plataforma sea muy especial, por supuesto (sistema integrado, etc.). También puede rescatar simplemente si fopen devuelve -1 e ignorar el error específico, como en el ejemplo dado en la pregunta. – onitake

+0

+1 por 'ENOENT'. Está en el estándar POSIX, y es un enfoque mucho mejor que el uso de 'stat', ya que puede conducir a condiciones de carrera y problemas de seguridad. –

1

Supongo que esto tiene más que ver con el entorno del sistema (como POSIX o BSD) que con la versión del lenguaje C que está utilizando.

En POSIX hay un syscall stat() que le dará información sobre un archivo, incluso si no puede leerlo. Sin embargo, si el archivo está en una ruta que no tiene permisos de acceso, siempre va a fallar independientemente de si el archivo existe.

Si no tiene acceso a la ruta, nunca debería ser posible buscar en los archivos contenidos.

3

Es imposible comprobar la existencia de cierta en pura norma ISO C. No hay muy buena manera portátil para determinar si existe un fichero denominado ; probablemente deba recurrir a métodos específicos del sistema.

2

Esto no es algo portátil, así que le daré llamadas específicas del sistema operativo.

En Windows usa GetFileAttributes y comprueba que haya un -1 de retorno (INVALID_HANDLE o algo así).

En Linux, tiene fstat para hacer esto.

La mayoría de las veces, sin embargo, acabo de hacer el truco de apertura de archivos para probar, o simplemente seguir adelante y usar el archivo y buscar excepciones (C++/C#).

1

¿Realmente desea acceder al archivo? Por lo general, un control es mejor con el acceso (nombre de archivo, F_OK) == 0 de unistd.h y creo que es bastante amplio.

Cuestiones relacionadas