Представьте, что у вас есть библиотека для работы с каким-либо файлом XML или файлом конфигурации. Библиотека читает весь файл в памяти и предоставляет методы для редактирования содержимого. Когда вы закончите манипулирование контентом, вы можете вызвать write
, чтобы сохранить содержимое обратно в файл. Вопрос заключается в том, как сделать это безопасным способом.
Перезапись существующего файла (начиная с записи в исходный файл) явно небезопасна. Если метод write
выходит из строя до его завершения, вы получаете половину записанного файла, и вы потеряли данные.
Лучшим вариантом было бы записать в файл временный где-нибудь, а когда метод write
закончен, вы скопируете временный файл в исходный файл.
Теперь, если копия как-то терпит неудачу, вы все равно правильно сохранили данные во временном файле. И если копия завершается успешно, вы можете удалить временный файл.
В системах POSIX, я думаю, вы можете использовать системный вызов rename
, который является атомной операцией. Но как бы вы сделали это лучше всего в системе Windows? В частности, как вы справляетесь с этим с помощью Python?
Кроме того, существует ли другая схема безопасного написания файлов?