В чем разница между FileStream.Flush () и FileStream.Flush (True)? - PullRequest
21 голосов
/ 07 февраля 2011

MSDN говорит, что FileStream.Flush(True) "также очищает все промежуточные файловые буферы.".

Что именно означает "все промежуточные файловые буферы"?

Ответы [ 3 ]

23 голосов
/ 07 февраля 2011

Это приводит к тому, что данные файла, которые буферизируются в кеше файловой системы, записываются на диск. Эти данные обычно записываются лениво, в зависимости от положения головки записи на диск. Технически возможно иметь гигабайт кэшированных данных, поэтому это может занять довольно много времени. Если это важно для вас, рассмотрите вариант FileOptions.WriteThrough. Это полностью отключает кеширование записи. Это может быть очень дорого; Вы узнаете, насколько медленные жесткие диски на самом деле.

6 голосов
/ 07 февраля 2011

Когда вы вызываете Flush() или Flush(false), FileStream "копирует в файл любые данные, ранее записанные в буфер, и очищает буфер (кроме его состояния кодера)". Буфер здесь означает внутренний буфер класса FileStream. И копирование в файл не означает запись данных на диск. Это просто передача данных в ОС.

Но операции ввода-вывода в ОС Windows также буферизуются - запись данных на диск может быть отложена до тех пор, пока система не будет готова это сделать. Таким образом, очистка всех промежуточных буферов обеспечивает запись буферизованных данных на диск. Буферы здесь означают внутренние буферы Windows [кэш файловой системы].

Кстати, когда вы закрываете файл, все буферизованные данные будут записаны на диск автоматически. Таким образом, этот материал нужен вам только в том случае, если вам нужно сбросить данные до закрытия дескриптора файла.

1 голос
/ 07 февраля 2011

Это сделает дополнительный вызов для сброса буфера в файл:

 Win32Native.FlushFileBuffers(this._handle);
...