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
Respuesta
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)
}
"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. –
@Steve Jessop: a la derecha ... gracias por señalarlo. Solucioné la respuesta. – Heisenbug
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
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.
... y verifica el valor de 'errno' por el motivo por el cual' fopen' falló; 'ENOENT' si el archivo no existe. –
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.
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. –
Abra el archivo y compruebe el valor de retorno de fopen()
o open()
.
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.
stat? ¿acceso? ¿abierto? ¿Quién pidió funciones de Unix no estándar? Esta respuesta está fuera de tema. – Lundin
@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
@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
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.
- 1. comprobando si el archivo existe en un directorio específico
- 2. Objective-C - Comprobando si existe URL
- 3. comprobando si existe o no un paquete
- 4. Comprobando si un elemento ya existe en un JComboBox?
- 5. Comprobando si existe la propiedad
- 6. comprobando invariantes en C++
- 7. Comprobando si existe un valor en una lista Redis
- 8. Comprobando si un archivo es legible y existe en una condición if: if [[-r -f "/file.png"]]
- 9. NSFileManager no elimina un archivo que existe
- 10. File.Exists que devuelve true para un archivo que no existe
- 11. Comprobando si existe una clave de registro
- 12. Comprobando si el usuario de mysql existe
- 13. jQuery: Comprobando si existe el siguiente elemento
- 14. Comprobando si existe una URL o no
- 15. Comprobando la existencia y si existe, hay un cierto valor
- 16. ¿Cómo saber si existe un archivo en C#/.NET?
- 17. Compruebe que existe un * tipo * de archivo en Python
- 18. En MVC 2, ¿cómo determinaría que existe un archivo en el servidor usando C#?
- 19. Comprobando si un objeto es un diccionario en C#
- 20. Comprobando si existe una ID en los recursos (R.id.something)
- 21. Cómo comprobar si un archivo existe en un archivo MAKE
- 22. Comprobando si existe una fecha o no en Java
- 23. ¿Cómo comprobar si existe un directorio que contiene un archivo?
- 24. ¿Por qué no abrirá un archivo que existe?
- 25. Comprobando si un archivo se abrió correctamente con ifstream
- 26. Comprobando si existe una imagen en el paquete - iPhone
- 27. Comprobando cuándo se modificó por última vez un archivo en C# en Windows OS
- 28. Python Lxml (objectify): Comprobando si existe una etiqueta
- 29. Comprobando si un archivo es un ensamblado .NET
- 30. C++ - Comprobando 3 en una fila
mismo que http://stackoverflow.com/questions/650739/checking-whether-a-file-can-be-opened-using-portable-c – Coren