2011-02-07 12 views
20

MSDN dice que FileStream.Flush(True) "también borra todos los almacenamientos intermedios de archivos intermedios.".¿Cuál es la diferencia entre FileStream.Flush() y FileStream.Flush (True)?

¿Qué significa "todos los almacenamientos intermedios de archivos intermedios" significa exactamente?

+1

Nota La descarga (verdadera) se ha roto en determinadas condiciones por cada informe de error de Microsoft http://connect.microsoft.com/VisualStudio/feedback/details/634385/filestream-flush-flushtodisk-true-call-does-not-flush -the-buffers-to-disk # details. MS lo arregló, pero no dice en qué versión de .NET está arreglado. – jimvfr

+0

¿Alguna palabra sobre en qué versión de .NET se ha corregido este error? – BaltoStar

Respuesta

23

Hace que los datos del archivo almacenados en la memoria caché del sistema de archivos se escriban en el disco. Normalmente, estos datos se escriben de forma lenta, en función de la posición del cabezal de escritura del disco. Tener un gigabyte de datos en caché es técnicamente posible, por lo que puede llevar bastante tiempo. Si esto es importante para usted, considere la opción FileOptions.WriteThrough en su lugar. Deshabilita el almacenamiento en caché de escritura por completo. Esto puede ser muy caro; Descubrirás qué tan lentos son los discos duros.

0

Esto hará que una llamada extra para vaciar el búfer en el archivo:

Win32Native.FlushFileBuffers(this._handle); 
+2

¿Está bien publicar el código fuente de la implementación de MS? (a pesar de que creo que todo el código aquí no agrega valor a la respuesta) –

+1

Utilicé el reflector para realizar ingeniería inversa. Theer no es nada ilegal con eso. – Aliostad

+1

Publicación del código fuente: esto se ha discutido mucho en Meta. Por ejemplo, http://meta.stackexchange.com/questions/74890/is-it-inappropriate-to-post-decompiled-code-from-the-net-bcl y http://meta.stackexchange.com/questions/ 20153/posting-code-from-reflector – bic

4

Cuando se llama a Flush() o Flush(false), FileStream "copia en el archivo de los datos previamente escritos en la memoria intermedia y limpia el búfer (excepto para su estado del codificador) ". Buffer aquí significa buffer interno de la clase FileStream. Y copiar en un archivo no es escribir datos en el disco. Solo está pasando datos al sistema operativo.

Pero, las operaciones IO en el sistema operativo Windows también se almacenan en búfer: la escritura de datos en el disco podría posponerse hasta que el sistema esté listo para hacerlo. Por lo tanto, borrar todos los búferes intermedios obliga a escribir datos almacenados en el búfer al disco. Buffers aquí significa los búferes internos de Windows [File system cache].

BTW al cerrar el archivo, todos los datos almacenados en el búfer se escribirán en el disco automáticamente. Por lo tanto, necesita esto solo si necesita que se vacíen los datos antes de que se cierre el identificador de archivo.

+0

No hay "estado de codificador" en 'FileStream', toma bytes, no caracteres, y los transfiere de/al disco. ¿Estabas pensando en 'StreamWriter'? –

Cuestiones relacionadas