Вопрос по – Когда нужно очищать файл в Go?

14

Когда это необходимо сделатьсмывание в файл?
Я никогда не делаю этого, потому что я вызываю File.Close, и я думаю, что он очищается автоматически, не так ли?

С чего вы взяли, что .Close () автоматически сбрасывает байты в хранилище?The source for Close doesn't seem to indicate this - Я что-то упустил? Dan Esparza
Почему кто-то хотел закрыть это? Комментарий, пожалуйста? Denys Séguret

Ваш Ответ

4   ответа
13

что os.File не имеет .Flush (), потому что он не нужен, потому что он не буферизован. Записывает в него прямые системные вызовы для записи в файл.

Когда ваша программа завершает работу (даже в случае сбоя), все открытые файлы будут автоматически закрываться операционной системой, и файловая система будет записывать ваши изменения на диск, когда она до него дойдет (иногда до нескольких минут после выхода из программы) ,

Вызов os.File.Sync () вызовет системный вызов fsync (), который заставит файловую систему сбросить свои буферы на диск. Это будет гарантировать, что ваши данные находятся на диске и сохраняются, даже если система выключена или операционная система падает.

Вам не нужно звонить .Sync ()

Этот ответ смущаетfsync сfflush, Вам не нужноflush небуферизованный файл. Это не означает, что вам не нужноsync это если вы хотите гарантировать, что запись была зафиксирована на диске. Ответ Петра Прасмо лучше.
12

УвидетьВот. File.Sync() это системный вызовFSYNC, Вы должны быть в состоянии найти больше под этим именем.

Имейте в виду, чтоfsync это не то же самое, чтоfflush и не выполняется до закрытия.

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

Эта проблема не ограничивается только встроенными устройствами. Всегда существует риск того, что несинхронизированные записи прекратятся вместе с буфером в памяти файловой системы, но в современных журнализированных файловых системах это окно исчезающе мало. Некоторое оборудование с батарейным питанием может улучшить согласованность еще больше.sync это способ сделать программу более осведомленной о том, что базовое хранилище обновлено.
"Обычно вам не нужно называть это" Это верно только в том случае, если вы не работаете со встроенным устройством, где кто-то может решить отключить ваш источник питания в любое время.
2

Похоже, большинство рекомендаций здесь состоит в том, чтобы не вызывать fsync (), но в целом это в основном зависит от требований вашего приложения. Если вы работаете с критически важным файлом для чтения / записи, всегда рекомендуется вызывать fsync ().

http://www.microhowto.info/howto/atomically_rewrite_the_content_of_a_file.html#idp31936

ссылка, содержит более подробную информацию о том, когда file.Sync () поможет.

0

Когда вы хотите максимально обеспечить целостность данных. Например, что произойдет, если ваша программа завершит работу до закрытия файла?

Похожие вопросы