Какие рекомендации вы рекомендуете для защиты пользовательских данных при записи в файл? - PullRequest
1 голос
/ 21 июля 2009

Допустим, у вас есть программа, такая как текстовый редактор или текстовый процессор, которая пишет в созданные пользователем файлы. Какие шаги следует предпринять, чтобы гарантировать минимальный риск потери или повреждения данных в случае сбоев, ошибок нехватки места, внезапной потери питания, состояния гонки и т. Д.?

Ответы [ 4 ]

1 голос
/ 21 июля 2009

Хорошее эмпирическое правило для защиты важных данных:

НИКОГДА НЕ ИЗМЕНЯЙТЕ ЕДИНСТВЕННУЮ КОПИЮ

В случае текстовых процессоров и текстовых редакторов Word я считаю стандартным создание «теневой копии» (это может не быть техническим термином), которая является копией исходного файла, в который вносятся все изменения. Периодически (или когда пользователь запрашивает) вы можете принудительно сохранить, который содержит изменения в исходном файле. Преимущество этого заключается в том, что в случае сбоя в любой момент всегда есть хотя бы одна действительная копия данных.

Настоящая цель - достичь атомарности - операция может быть успешной или неудачной, и никогда не иметь неполного состояния. Есть много других способов достижения атомарности, кроме «теневых копий», но я считаю, что это делают текстовые редакторы.

0 голосов
/ 21 июля 2009

Возможно, это устарело на современных машинах с несколькими гигабайтами, но при разработке на Mac я помню, что мы использовали для выделения блок памяти, который был бы достаточно большим для выполнения операции сохранения.

Если у нас закончилась память, мы могли бы затем предупредить пользователя о том, что ему / ей не хватает памяти, а затем освободить этот блок, чтобы могла быть выполнена операция сохранения.

Другие функции, которые важны для сохранения пользовательских данных, - это отмена, в идеале неограниченная отмена / повтор.

0 голосов
/ 21 июля 2009

Я написал ранее ответ на похожую проблему, которая применима и здесь. Шаги:

  1. Написать временный файл с новыми данными
  2. Переместить временный файл в файл резервной копии в каталоге исходного файла.
  3. Выполните атомарную замену резервной копии и исходного файла (File.Replace в Windows или замена inode в Unix).
  4. Удалить файл резервной копии (теперь оригинальный).
0 голосов
/ 21 июля 2009

Использование SQLite

Ну, хорошо, странно использовать БД для текстового редактора, но текстовый процессор имеет настолько много состояния, что это может иметь некоторый смысл. Конечно, это имеет смысл в качестве формата хранения для многих видов приложений. На вики-сайте SQLite есть страница об использовании ее для журналов отмены и повторения.

Для текстового редактора вы можете использовать методы, которые используют базы данных: запись в журнал вперед или журнал отката, а также хорошая синхронизация фиксации с диском. Или вы можете хранить две версии каждого файла.

...