2012-02-28 15 views
5

Estoy intentando abrir un archivo en una aplicación C. ¿Cómo compruebo que existe un archivo antes de intentar leer de él?Comprobando que existe un archivo en C

+0

mismo que http://stackoverflow.com/questions/650739/checking-whether-a-file-can-be-opened-using-portable-c – Coren

Respuesta

12

intenta abrirlo:

FILE * file; 
file = fopen("file_name", "r")); 
if (file){ 
    //file exists and can be opened 
    //... 
    // close file when you're done 
    fclose(file); 
}else{ 
    //file doesn't exists or cannot be opened (es. you don't have access permission) 
} 
+0

"el archivo no existe": no sigue del todo, podría existir pero no tiene permiso para abrirlo para leerlo. Pero el que pregunta probablemente necesita saber si puede leerlo, y eso es lo que te dice. –

+0

@Steve Jessop: a la derecha ... gracias por señalarlo. Solucioné la respuesta. – Heisenbug

+1

También recuerde 'fclose (file)' cuando haya terminado con ella, si es que existió.Es fácil olvidarse de cerrar la transmisión cuando todo lo que hace es simplemente ver si el archivo se abre, pero si no lo hace, entonces ni su aplicación ni otras aplicaciones podrán abrir el archivo hasta que la aplicación finalice. , etc., que es para proteger contra múltiples programas que realizan operaciones de escritura en el mismo archivo simultáneamente, ya que eso no tendría ningún sentido. – rsethc

2

Debe verificar el resultado de fopen.

FILE *fp; 

if (!(fp = fopen(name, "r"))) { 
    perror("fopen"); 
    /* Handle error, return, exit, try again etc. */ 
} 

/* Normal code goes on. */ 

Si fopen vuelve NULL, el archivo es inaccesible por alguna razón. Podría faltar o quizás el proceso no tenga permisos.

+2

... y verifica el valor de 'errno' por el motivo por el cual' fopen' falló; 'ENOENT' si el archivo no existe. –

3

se podría hacer algo como esto:

bool file_exists(const char * filename) { 
    if (FILE * file = fopen(filename, "r")) { 
     fclose(file); 
     return true; 
    } 
    return false; 
} 

Básicamente basta con abrir el archivo y comprobar si tenía éxito.

+0

El problema con una función como esta es que la respuesta puede ser falsa en el intervalo entre el cierre del archivo y la devolución, porque el sistema de archivos es un recurso mutable global en todo el sistema. Por lo tanto, cuando "comprueba que existe un archivo antes de intentar leer de él", siempre que sea posible, siempre debe usar el mismo identificador de archivo para leer como lo utilizó para el control. Hay casos en los que no importa que su información no esté actualizada, en cuyo caso también podría usar 'stat' cuando esté disponible. –

0

Abra el archivo y compruebe el valor de retorno de fopen() o open().

6

Existencia: llamar stat(), compruebe el código de retorno, que no tiene efectos secundarios. En UNIX, llame al access() también.

Lo harías en caso de que simplemente estés haciendo lo que pediste, si FileA existe, no necesariamente puedo abrirlo. Ejemplo: en UNIX, un archivo con permisos de solo ejecución fallaría, pero seguiría existiendo.

Con stat puede consultar st_mode para acceder. Sin embargo, dado que tiene la intención de abrir el archivo de todos modos, es probable que fopen o open sean lo que usted desea.

+0

stat? ¿acceso? ¿abierto? ¿Quién pidió funciones de Unix no estándar? Esta respuesta está fuera de tema. – Lundin

+4

@Lundin: Tampoco pidió funciones estándar que no sean de Unix. Esta respuesta es sobre el tema. Además, todos son estándar en POSIX, que a su vez * es * un estándar. – netcoder

+0

@netcoder Él lo hizo. Está etiquetado como C, por lo tanto, debemos asumir que el OP está pidiendo funciones de lenguaje C. El lenguaje C se define en el estándar ISO, no hay otra definición para él. Posix es un estándar para sistemas operativos, el manejo de archivos no significa automáticamente que se trate de un sistema operativo. – Lundin

1

La prueba si el archivo existe no es muy difícil. Existen numerosas formas de hacerlo, pero después de leer sobre esto decidí que el mejor método es usar el método stat. Sugiero usar stat, porque creo que es importante poder distinguir archivos y directorios. Sugiero esto para Windows y Unix.

Aquí se proporcionan dos enlaces a la documentación en MSDN y opengroup.

Windows

Unix

Cuestiones relacionadas