2012-06-02 20 views
11

¿Cuándo es necesario hacer en un archivo?
Nunca lo hago porque llamo a File.Close, y creo que se vacía automáticamente, ¿no es así?¿Cuándo vaciar un archivo en Go?

+0

¿Por qué alguien quiere cerrar esto? Un comentario por favor? –

+0

¿Qué te hace pensar que .Close() vacía automáticamente los bytes al almacenamiento? [La fuente de Close no parece indicar esto] (https://golang.org/src/os/file_unix.go?s=5591:5619#L179) - ¿Me falta algo? –

Respuesta

12

Notarás que un archivo os.File no tiene un .Flush() porque no lo necesita porque no está almacenado. Las escrituras son syscalls directas para escribir en el archivo.

Cuando su programa se cierra (incluso si falla) todos los archivos que tiene abiertos serán cerrados automáticamente por el sistema operativo y el sistema de archivos escribirá sus cambios en el disco cuando lo necesite (a veces hasta unos minutos después) tu programa sale).

Llamar a os.File.Sync() llamará al fysync() syscall que forzará al sistema de archivos a vaciar sus búferes en el disco. Esto garantizará que sus datos estén en el disco y sean constantes incluso si el sistema se apaga o el sistema operativo falla.

No es necesario llamar .sync()

+1

Esta respuesta confunde 'fsync' con' fflush'. No necesita _flush_ un archivo sin búfer. Eso no significa que no necesite _sync_ si desea una garantía de que la escritura se confirmó en el disco. La respuesta de Piotr Praszmo es mejor. –

0

Cuando desee garantizar la integridad de los datos tanto como sea posible. Por ejemplo, ¿qué sucede si su programa se bloquea antes de cerrar el archivo?

10

Ver here. File.Sync() es syscall al fsync. Deberías poder encontrar más bajo ese nombre.

Tenga en cuenta que fsync no es lo mismo que fflush y no se ejecuta antes de cerrar.

Por lo general, no es necesario que lo llame. El archivo se escribirá en el disco de todos modos, después de un tiempo y si no hay un corte de energía durante este período.

+2

"Generalmente, no es necesario que lo llame" Lo cual solo es cierto si no está trabajando en un dispositivo incorporado en el que alguien puede decidir desconectar su fuente de alimentación en cualquier momento. – Joppe

+0

El problema no está limitado solo a los dispositivos integrados. Siempre existe el riesgo de que las escrituras no sincronizadas mueran junto con el búfer en memoria de un sistema de archivos, pero con los modernos sistemas de archivos registrados por diario, esa ventana es infinitamente pequeña. Algunos hardware con respaldo de batería pueden mejorar la consistencia aún más. 'sync' es la manera de hacer que el programa sea más consciente de que el almacenamiento subyacente está actualizado. –

Cuestiones relacionadas