Pull to refresh

Как правильно сохранять файлы?

Reading time2 min
Views1.7K
Допустим, есть какой-либо файл, например, конфиг.
Нужно прочитать его, изменить какое-то значение, и опять записать.
Казалось бы, что может быть проще?

Выполняя аудит кода для различных команд, я обратил внимание, что практически в каждом проекте неправильно делается сохранение файлов. И для меня оказалось откровением, что для подавляющего большинства даже неплохих программистов это знание оказалось закрытым… Чтобы не повторяться многократно, хочу поделиться этим сокровенным знанием. Кстати, это применимо к всем языкам программирования.

1. Создаете временный файл, при этом обрабатываете все возможные при этом исключительные ситуации.
2. Запись делаете в этот временный файл, при этом также обрабатываете все возможные при записи исключительные ситуации.
3. Закрываете временный файл, и помните, что при закрытии тоже могут быть исключительные ситуации (так как делается flush буфера и ряд операций в файловой системе).
4. Если на предыдущих шагах все в порядке, переименовываете временный файл, присваивая ему имя существующего файла, при этом старый файл удаляется, и временный файл его заменяет. В этом случае также нужно перехватывать и обрабатывать все возможные исключительные ситуации.

Шаги 1-3 могут быть объединены в один шаг, если используется специальная функция или метод для создания и сохранения файла целиком, одной операцией.

Если так не делать, то малейшая проблема типа недостатка места на диске может привести к потере данных (например, если нет места на диске, то при обычной записи в файл напрямую будет создан файл нулевой длины на месте старого, и дальнейшая запись производиться не будет). И таких проблем возможна масса, например, компьютер может перезагрузиться в процессе сохранения, в этом случае также запись не будет выполнена, и файл окажется запорченным, и т.д.
Tags:
Hubs:
Total votes 21: ↑15 and ↓6+9
Comments55

Articles