Сохраненные файлы иногда содержат только NUL-символы

В нашем приложении Windows 8.1 (WinRT) есть проблема, которая иногда приводит к повреждению сохраненного файла. Файлы имеют правильный размер файла, но файл содержит только NUL-символы. Файл должен содержать сериализованный объект в виде XML.

В попытке найти проблему, мы не перезаписываем файл, мы делаем следующее:

  1. Сериализует текущий объект во временный файл.
  2. Проверьте содержимое временного файла
  3. Скопируйте текущий файл (в.timestamp.xml.bak)
  4. Переместить / заменить временный файл в текущий файл

В большинстве случаев все это работает нормально, но иногда.timestamp.xml.bak-файл и файл содержимого повреждаются. Кроме того, файл журнала также поврежден (также только NUL-символы). Весь файл состоит из NUL-символов. Когда я смотрю на след bak-файлов и основной файл, я вижу, что основной файл увеличивается в размере. Это должно быть правильно, потому что добавлен новый XML-элемент. Но он не содержит XML.

Я понятия не имею, как и почему это происходит. Это происходит примерно в 5% файлов, которые должны быть отредактированы, и каждый поврежденный файл происходит после 5-20 попыток сохранения. Так же бывает на нескольких планшетах.

Вот фрагмент кода, который создает поврежденные файлы:

StorageFile file = await lDataFld.CreateFileAsync(filename + ".tmp",  CreationCollisionOption.OpenIfExists);

StorageFile oldFile = await dataFld.GetFileAsync(filename + ".xml");
if (oldFile != null)
{
await oldFile.CopyAsync(dataFld, string.Format("{0}.{1}.xml.bak", filename, DateTime.Now.ToString("yyyyMMddHHmmssfffffff")), NameCollisionOption.ReplaceExisting);
}
await file.MoveAndReplaceAsync(await dataFld.GetFileAsync(filename + ".xml"));

Logger.Log(string.Format("Saved {0}.", filename));

Может кто-нибудь сказать мне, как мы получаем файлы, содержащие только NUL-символы, и как / почему это происходит? И даже лучше, как это можно исправить.

Небольшое замечание: мы никак не можем воспроизвести эту проблему, она возникает только в нашей производственной среде.

1 ответ

Единственные причины, которые я могу придумать, могут привести к такому результату:

  • Жесткие сбои ОС (BSOD) в середине записи файла
  • Приложение прекращается в середине записи файла

Я предполагаю, что это вторая причина.

Учитывая это и тот факт, что вы говорите, что это приложение времени выполнения Windows, и я предполагаю, что приложение не завершается вручную, я предполагаю, что это как-то связано с жизненным циклом времени выполнения Windows. Учитывая, что приложение UWP может быть "приостановлено", когда оно переходит в фоновый режим, а затем может быть прервано ОС в любой момент в режиме "приостановлено" (очень похоже на мобильные ОС, такие как на Android или IOS).

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

Исправление состоит в том, чтобы убедиться, что вы отмечаете ваше приложение, говоря, что оно выполняет "фоновую" работу, в то время как оно выполняет запись вашего файла, чтобы ОС не приостановила вас во время записи файла. Практически во всех мобильных ОС есть функция такого типа, которая позволяет вам немного "переполниться", чтобы убедиться, что вы можете выполнить свою работу до того, как ваше приложение будет приостановлено / прекращено. Для приложений UWP ознакомьтесь с фоновыми задачами или посмотрите, как обрабатывать приостановку приложения / отложенную приостановку приложения.

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