2012-06-02 1 views
11

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

+0

Почему кто-то хочет закрыть это? Комментарий, пожалуйста? –

+0

Что заставляет вас думать, что .Close() автоматически удаляет байты на хранение? [Источник для Close не указывает на это] (https://golang.org/src/os/file_unix.go?s=5591:5619#L179) - Я что-то пропустил? –

ответ

12

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

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

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

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

+1

Этот ответ путает 'fsync' с' fflush'. Вам не нужно _flush_ небуферизованный файл. Это не значит, что вам не нужно _sync_, если вы хотите гарантировать, что запись была зафиксирована на диске. Ответ Пиотра Празмо лучше. –

0

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

10

См. here. File.Sync() - это syscall to fsync. Вы должны быть в состоянии найти больше под этим именем.

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

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

+2

«Вам вообще не нужно называть это» Это верно только в том случае, если вы не работаете с встроенным устройством, где кто-то может в любое время отключить ваш источник питания. – Joppe

+0

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

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^