Подтвердить что ты не робот

Какая разница между FileStream.Flush() и FileStream.Flush(True)?

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

 Win32Native.FlushFileBuffers(this._handle);