ОПЕРАЦИЯ · ЗАПИСЬ
Атомарно заменить файл
Опубликовать полностью подготовленный файл одним rename.
Предупреждение. current.txt будет заменён; прежнее содержимое без копии не восстановить.
Предварительные условия
Python 3, локальная файловая система с атомарным rename; prepared.txt рядом с current.txt. Предварительно сохраните копию current.txt.
Команда
python3 - <<'PY'
import os
from pathlib import Path
src, dst = Path("prepared.txt"), Path("current.txt")
assert src.is_file() and src.parent == dst.parent
with src.open("rb") as f:
os.fsync(f.fileno())
os.replace(src, dst)
PYОбъяснение аргументов
os.replace заменяет имя назначения. Открытый читателем старый inode остаётся доступен этому читателю.
Ожидаемый результат
Новые открытия видят целиком новый файл. Это не транзакция для набора файлов.
Проверка
Сравните SHA-256 current.txt с ранее записанным хешем prepared.txt.
Распространённые ошибки
- На разных файловых системах rename не работает. Для устойчивости к отключению питания нужен fsync каталога на поддерживаемой ОС.
Обратимость
Возврат возможен только из заранее сохранённой копии.