Содержимое файла потеряно / повреждено при использовании StorageFile

TL/DR: у нас есть универсальное приложение Windows, которое взаимодействует с данными JSON, хранящимися локально с использованием класса StorageFile. После использования приложения в течение дня пользователь получает исключение UnauthorizedAccessException, и данные исчезают.

Длинная версия: у нас есть универсальное приложение Windows, которое извлекает данные из API и сохраняет эти данные локально в файлы JSON в ApplicationData.Current.LocalFolder для нашего приложения, чтобы пользователи могли работать в автономном режиме. Данные обычно извлекаются в начале дня и в конце дня и отправляются обратно в API. Когда запись успешно отправляется обратно в API, она удаляется из локального JSON. Весь процесс синхронизации с API запускается вручную с помощью кнопки в пользовательском интерфейсе. Этот рабочий процесс также ограничивает объем данных, передаваемых между приложением и API, и предотвращает бесконечный рост локальных файлов.

Мы загружаем данные в коллекции в памяти, используя класс StorageFile, чтобы прочитать содержимое файла JSON и преобразовать их в объекты нашей модели, используя объект Newtonsoft JsonConvert. Все это плавно продвигалось в течение некоторого времени до недавнего времени, когда пользователи начали сообщать об исчезновении данных. Глядя на файлы журналов приложений, мы видим одно постоянное сообщение об ошибке:

'Exception when reading file "<filename>" from storage: System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at HQSTouch.Infrastructure.StorageManager.<ReadFromStorageAysnc>d__2.MoveNext()'

Мы можем увидеть эту ошибку при чтении файла или при записи в него. К сожалению, результатом этих ошибок, по крайней мере с точки зрения конечных пользователей, является то, что данные исчезают. Обычно это происходит после того, как пользователь использовал приложение большую часть дня, завершая свою работу над 10 из 15 записей. В моем тестировании я видел, как размер файла JSON вырос с <50 Кбайт до нескольких сотен Кбайт, что не казалось чрезмерным.

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

Любая помощь будет принята с благодарностью. Благодарю.

Изменить: хотя это может быть похоже на вопросы, опубликованные в Как обрабатывать параллелизм с операциями StorageFile? мы были осторожны с нашими операциями async / await, особенно при взаимодействии с файловой системой. Быстрое сканирование стека кода показывает, что наши методы возвращают Задачу и ожидаются. Я чувствую, что наша ситуация отличается от того, что обсуждалось в этой теме. В частности, для одного пользователя эта проблема стала возникать после последнего раунда обновлений Windows. До обновления Windows они некоторое время использовали приложение без каких-либо проблем. В то время не было никаких обновлений для нашего приложения.

0 ответов

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