Вызов File.WriteAllText при сбое компьютера приводит к потере данных

У меня есть следующий код для сохранения данных:

File.Copy("data.txt", "data_backup.txt", true);
File.WriteAllText("data.txt", JsonConvert.SerializeObject(new
{
    bool1,
    string1,
    decimal1,
    decimal2,
    int1,
    datetime,
    object1,
    object2
}, new JsonSerializerSettings { Formatting = Formatting.Indented, Converters = new List<JsonConverter>() { new DontIntendArray() } }));

который моя программа выполняется каждые 15 секунд. Размер файла data.txt составляет около 9 МБ.

Время от времени, когда мой компьютер дает сбой, после перезагрузки я обнаруживаю, что data.txt полон символов NULL, а его размер остается около 9 МБ. Вот почему я добавил строку data_backup.txt, но это не помогает, так как он также сохраняет файлы, полные NULL.

Обратите внимание, что это происходит не на каждом компьютере, а, по-видимому, только в случае сбоя во время выполнения этого кода.

Я испытывал такое поведение при использовании профиля XMP в моей оперативной памяти, который был нестабильным и время от времени вызывал сбой. Это было точно так же на двух разных компьютерах с нестабильным профилем XMR. Я также испытал это во время отключения электричества.

Я понимаю, что не могу ожидать, что сбойный компьютер безошибочно выполнит весь код и только после этого произойдет сбой. Тем не менее, есть ли какой-нибудь прием, который я могу использовать, чтобы предотвратить потерю содержимого файлов, которые просто записываются или сохраняются во время или за мгновение до сбоя компьютера? Целью регулярного сохранения этих переменных в файл является предотвращение потери данных в случае сбоя компьютера, но, очевидно, такой подход не всегда работает.

1 ответ

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

Другие вопросы по тегам