2010-09-06 18 views
5

Suponga que alguien escribió un método que abre un determinado archivo y olvida cerrarlo en algunos casos. Dado este método, ¿puedo asegurarme de que el archivo esté cerrado sin cambiando el código del método original?cómo asegurarse de que un archivo se cerrará al final de la ejecución

La única opción que veo es escribir un método que envuelve el método original, pero esto sólo es posible si el archivo se define fuera del método original, ¿verdad? De lo contrario se pierde para siempre ...

+1

¿Qué método está llamando para abrir el archivo? – bjskishore123

+1

C++ tiene funciones, no métodos. –

+1

Si el método puede "olvidarse" de cerrar el archivo, entonces no está usando una secuencia de archivo C++. ¿Qué está usando en su lugar? –

Respuesta

6

Dado que este es C++, yo esperaría que la E/S arroyos biblioteca (std::ifstream y amigos) se utilizaría, biblioteca no el legado C/S. En ese caso, sí, el archivo se cerrará porque el flujo está cerrado por el destructor del objeto de transmisión.

Si está utilizando la API C heredada, entonces no, no tiene suerte.

En mi opinión, la mejor respuesta a una pregunta de entrevista como esta es señalar la falla real en el código - administrar los recursos manualmente - y sugerir la solución correcta: utilizar la administración automática de recursos ("La adquisición de recursos es Inicialización "o" Gestión de recursos delimitada por alcance ").

+0

RAII según Wikipedia: http://en.wikipedia.org/wiki/Resource_acquisition_is_initialization – FuleSnabel

+0

@ James: Si se utiliza la API de C, _fcloseall función() se puede utilizar para cerrar todos los archivos abiertos. – bjskishore123

+2

@ bjskishore123: No sé de dónde viene '_fcloseall()', pero no es parte de la biblioteca estándar de C. Sin embargo, dado su nombre, no veo cómo sería de mucha utilidad en ningún programa real: su uso indicaría que se han borrado los graves errores del programa. –

2

Tiene razón en que si la envoltura no de alguna manera obtener una referencia al archivo abierto, que puede ser difícil para cerrarla. Sin embargo, el sistema operativo podría proporcionar un medio para obtener una lista de archivos abiertos, y luego podría encontrar el que necesita cerrar.

Sin embargo, tenga en cuenta que la mayoría de los sistemas operativos (prácticamente todos) se encargan de cerrar archivos cuando la aplicación finaliza, por lo que no necesita preocuparse porque un archivo permanezca abierto indefinidamente después de que el programa se detenga. (Esto puede o no puede ser una respuesta razonable a la pregunta que se les dio, lo que parece muy vaga y ambigua.)

0

qué entorno se encuentra? Siempre puede verificar los descriptores de archivos abiertos por el proceso y cerrarlos con fuerza.

En Linux puede usar el comando lsof para listar archivos abiertos para un proceso. Hazlo una vez antes del método y una vez después del método para detectar archivos recién abiertos. Con suerte, no estás luchando contra una bestia heredada multiproceso.

1

Si está utilizando la función C para abrir el archivo, puede utilizar la función _fcloseall para cerrar todos los archivos abiertos.

Si está utilizando C++, igual que James sugirió, destructor corriente debe cuidar de él.

Cuestiones relacionadas