TL/DR: StorageFile クラスを使用して、ローカルに保存された JSON データと対話する Windows ユニバーサル アプリケーションがあります。アプリを 1 日使用した後、ユーザーは UnauthorizedAccessException を受け取り、データが消えます。
長いバージョン: API からデータを取得し、そのデータをアプリの ApplicationData.Current.LocalFolder 内の JSON ファイルにローカルに保存する Windows ユニバーサル アプリケーションがあり、ユーザーはオフラインで作業できます。通常、データは 1 日の開始時に取得され、1 日の終了時に API に返されます。レコードが API に正常に送り返されると、ローカル JSON から削除されます。API との同期プロセス全体は、UI のボタンを使用して手動でトリガーされます。このワークフローは、アプリと API の間で送信されるデータの量も制限し、ローカル ファイルが無限に大きくなるのを防ぎます。
StorageFile クラスを使用して JSON ファイルの内容を読み取り、Newtonsoft JsonConvert オブジェクトを使用してそれらをモデル オブジェクトに変換することにより、メモリ内コレクションにデータを読み込みます。これらはすべて、ユーザーがデータが消えていると報告し始めた最近まで、しばらくの間順調に進んでいました. アプリのログ ファイルを見ると、1 つの一貫したエラー ポップアップが表示されます。
'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()'
ファイルの読み取り時または書き込み時に、このエラーが表示されることがあります。これらのエラーの残念な結果は、少なくともエンド ユーザーの観点からは、データが消失することです。これは通常、ユーザーが 1 日の大半でアプリを使用し、15 レコード中 10 レコードで作業を完了した後に発生します。私のテストでは、JSON ファイルのサイズが 50Kb 未満から 200Kb に跳ね上がるのを確認しましたが、これは大きすぎるようには見えませんでした。
データが消えても、すべてが消えるわけではありません。ファイル アクセス エラーの後、ユーザーがまだレコードで作業していたためにメモリ内にある場合、その 1 つのレコードがローカル JSON ファイル内の唯一のレコードになります。データをローカル ファイルに保存するときは、ファイルからコレクションにデータを読み込み、変更されたレコードをマージしてから、すべてをシリアライズして JSON ファイルに書き戻し、ファイルの内容を置き換えます。
どんな助けでも大歓迎です。ありがとう。
編集:これは、StorageFile操作で同時実行を処理する方法に投稿された質問に似ているかもしれませんが? 、特にファイル システムとやり取りするときは、非同期/待機操作に注意を払ってきました。コード スタックをすばやくスキャンすると、メソッドが Task を返し、待機していることがわかります。私たちの状況は、そのスレッドで議論されたこととは異なると感じています。特に 1 人のユーザーにとって、この問題は最新の Windows 更新プログラムの後に発生し始めました。Windows アップデートの前は、問題なくアプリケーションをしばらく使用していました。その間、アプリの更新はありませんでした。