Какая разница между FileStream.Flush() и FileStream.Flush(True)?
MSDN говорит, что FileStream.Flush(True)
"также очищает все промежуточные файловые буферы.".
Что означает "все промежуточные буферы файлов"?
Ответы
Ответ 1
Это приводит к тому, что данные файла, которые буферизуются в кеше файловой системы, записываются на диск. Эти данные обычно лениво записываются в зависимости от положения головки записи на диске. Наличие гигабайта кэшированных данных технически возможно, так что это может занять некоторое время. Если это важно для вас, тогда рассмотрите опцию FileOptions.WriteThrough
. Он полностью отключает кэширование записи. Это может быть очень дорого; вы обнаружите, насколько медленными являются жесткие диски.
Ответ 2
Когда вы вызываете Flush()
или Flush(false)
, FileStream
"копирует в файл любые данные, ранее записанные в буфер, и очищает буфер (за исключением его состояния кодировщика)". Буфер здесь означает внутренний буфер класса FileStream
. И копирование в файл не записывает данные на диск. Он просто передает данные в ОС.
Но операции ввода-вывода в ОС Windows также буферизуются - запись данных на диск может быть отложена до тех пор, пока система не будет готова к этому. Таким образом, очистка всех промежуточных буферов обеспечивает запись буферизованных данных на диск. Буферы здесь означают внутренние буферы Windows [кеш файловой системы].
Кстати, когда вы закрываете файл, все буферизованные данные будут записаны на диск автоматически. Таким образом, вам нужны эти материалы только в том случае, если вам нужно очистить данные до того, как дескриптор файла будет закрыт.
Ответ 3
Это вызовет дополнительный вызов для сброса буфера в файл:
Win32Native.FlushFileBuffers(this._handle);