Я пишу в файл, и я вызываю flush() после того, как я закончил. Безопасно ли принудительно выйти из программы, скажем, вытащить вилку питания, не вызвав функцию close() в файле? Является вызовом flush(), достаточным для того, чтобы файл не стал поврежденным.
Для обеспечения того, чтобы содержимое было сброшено в операционную систему (и доступно для других запущенных приложений), достаточно будет либо flush()
либо close()
(то есть вам не нужны оба).
Чтобы содержимое было сброшено на диск, вам также необходимо добавить os.fsync()
или os.fdatasync()
. Обратите внимание, что в случае вновь созданного (или вновь переименованного) файла вам нужно беспокоиться о том, был ли также сброшен каталог.
Кстати, если вы заботитесь о том, чтобы действительно быть уверенными в том, что все добирается до диска, классическая презентация Eat My Data стоит вашего времени и внимания.
open()
имеет функцию fileno()
вы можете вызвать, чтобы получить номер FD для передачи в fsync()
. Это продемонстрировано в исходной документации, на которую я ссылаюсь.
fsync()
, а не простоflush()
илиclose()
. Потенциально даже больше, чем это, если это вновь созданный файл и его каталог, возможно, не был синхронизирован с диском.flush()
иclose()
достаточны для того, чтобы другие программы, работающие в системе, могли видеть ваши изменения; их недостаточно для того, чтобы эти изменения пережили нечистое завершение работы ОС. См. Docs.python.org/2/library/os.html#os.fsync.