Вызов 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 ответ
Вы должны сохранить новое имя файла, а затем переместить новый файл, чтобы заменить исходный после сохранения. Таким образом, независимо от того, когда вас прерывают, у вас всегда есть одна неповрежденная копия.