Як правильно зберігати файли?

Припустимо, є якийсь файл, наприклад, конфіг.


Потрібно прочитати його, змінити якесь значення, і знову записати.

Здавалося б, що може бути простіше?

Виконуючи аудит коду для різних команд, я звернув увагу, що практично в кожному проекті неправильно робиться збереження файлів. І для мене виявилося одкровенням, що для переважної більшості навіть непоганих програмістів це знання виявилося закритим... Щоб не повторюватися багаторазово, хочу поділитися цим потаємним знанням. До речі, це стосується всіх мов програмування.

1. Створюєте тимчасовий файл, при цьому обробляєте всі можливі виняткові ситуації.

2. Запис робите в цей тимчасовий файл, при цьому також обробляєте всі можливі при записі виняткові ситуації.

3. Закривайте тимчасовий файл, і пам'ятайте, що при закритті можуть бути виняткові ситуації (оскільки робиться flush буфера та ряд операцій у файловій системі).

4. Якщо на попередніх кроках все гаразд, перейменовуєте тимчасовий файл, присвоюючи йому назву існуючого файлу, при цьому старий файл видаляється, і тимчасовий файл його замінює. У цьому випадку також потрібно перехоплювати і обробляти всі можливі виняткові ситуації.

Кроки 1-3 можуть бути об'єднані в один крок, якщо використовується спеціальна функція або метод для створення та збереження файлу цілком, однією операцією.

Якщо так не робити, то найменша проблема типу нестачі місця на диску може призвести до втрати даних (наприклад, якщо немає місця на диску, то при звичайному записі в файл безпосередньо буде створено файл нульової довжини на місці старого, і подальший запис проводитися не буде). І таких проблем можлива маса, наприклад, комп'ютер може перезавантажитися в процесі збереження, в цьому випадку також запис не буде виконаний, і файл виявиться запороженим, і т. д.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND