2011-02-07 15 views
20

MSDN dice che FileStream.Flush(True) "cancella anche tutti i buffer di file intermedi.".Qual è la differenza tra FileStream.Flush() e FileStream.Flush (True)?

Cosa significa esattamente "tutti i buffer di file intermedi"?

+1

Nota Flush (true) è rotto in determinate condizioni per segnalazione bug MS http://connect.microsoft.com/VisualStudio/feedback/details/634385/filestream-flush-flushtodisk-true-call-does-not-flush -the-buffer-to-disk # details. MS l'ha riparato, ma non dirà in quale versione .NET è stato corretto. – jimvfr

+0

Qualche parola su quale versione di .NET è stato risolto? – BaltoStar

risposta

23

Fa sì che i dati del file memorizzati nella cache del file system vengano scritti sul disco. Questi dati sono normalmente scritti pigramente, in base alla posizione della testina di scrittura del disco. Avere un gigabyte di dati nella cache è tecnicamente possibile, quindi può richiedere un po 'di tempo. Se questo è importante per te allora considera l'opzione FileOptions.WriteThrough. Disattiva completamente la cache di scrittura. Questo può essere molto costoso; scoprirai quanto sono veramente lenti gli hard disk.

0

Questo farà una chiamata in più per svuotare il buffer di file:

Win32Native.FlushFileBuffers(this._handle); 
+2

È corretto pubblicare il codice sorgente dall'implementazione MS? (Anche se penso che l'intero codice qui non aggiunga valore alla risposta) –

+1

Ho usato il reflector per decodificare. Theer non è nulla di illegale con questo. – Aliostad

+1

Postare il codice sorgente - Questo è stato discusso molto su Meta. Ad esempio http://meta.stackexchange.com/questions/74890/is-it-inappropriate-to-post-decompiled-code-from-the-net-bcl e http://meta.stackexchange.com/questions/ 20153/posting-code-from-reflector – bic

4

Quando si chiama Flush() o Flush(false), FileStream "copia al file di tutti i dati precedentemente scritti nel buffer e cancella il buffer (ad eccezione per il suo stato dell'encoder) ". Buffer qui significa buffer interno della classe FileStream. E copiare su file non sta scrivendo dati su disco. Passa solo dati al sistema operativo.

Tuttavia, le operazioni di I/O nel sistema operativo Windows sono anche bufferizzate - la scrittura dei dati sul disco potrebbe essere posticipata fino a quando il sistema non sarà pronto a farlo. Quindi, la cancellazione di tutti i buffer intermedi impone la scrittura di dati bufferizzati sul disco. I buffer qui indicano i buffer interni di Windows [cache del file system].

BTW quando si chiude il file, tutti i dati memorizzati nel buffer verranno scritti automaticamente sul disco. Quindi, hai bisogno di questa roba solo se hai bisogno che i dati vengano svuotati prima che l'handle del file venga chiuso.

+0

Non c'è "stato encoder" in "FileStream", richiede byte - non caratteri - e li trasferisce da/a disco. Stavi forse pensando a 'StreamWriter'? –

Problemi correlati