1

Windows8 では、GetBasicPropertiesAsync() を使用して、新しく作成されたファイルのサイズを取得しようとしています。 常にではありませんが (約 25% の確率で)、この呼び出しでは次の例外が発生します。

"Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))".  

ファイルは DotNetZip を使用して作成されます。実行に数分かかるアーカイブに何千ものファイルを追加しています。

using (ZipFile zip = new ZipFile())
{
    zip.AddFile(...); // for thousands of files
    zip.Save(cr.ArchiveName);
}
var storageFile = await subFolder.GetFileAsync(cr.ArchiveName);  
// storageFile is valid at this point
var basicProperties = await storageFile.GetBasicPropertiesAsync(); // BOOM!

いくつかの明らかにランダムなことが例外の可能性を減らしているようです:

  1. ループの開始前に、cr.ArchiveName の既存のコピーを削除します。
  2. エクスプローラーを使用してディレクトリを表示しない

変でしょ?ファイル システム トンネリングに関連するバグか、ZipFile が破棄された後でも、DotNetZip が実行してリソースを保持している (おそらく TEMP ファイルの名前を変更する) 内部キャッシングのような匂いがしますか?

4

1 に答える 1

0

私自身の質問に(失敗して)答えようとしています。

最初は、これはDotNetZipが次のガベージコレクションまでファイルハンドルを保持するという既知の問題でしたが。http://slsharpziplib.codeplex.com/のDotNetZipのSL/WP7ポートを使用していますが、この作業項目で修正されたバグはおそらく含まれていません。

http://dotnetzip.codeplex.com/workitem/12727

しかし、その理論によれば、次のことを行います。

GC.Collect();
GC.WaitForPendingFinalizers();

回避策を提供する必要がありましたが、提供しませんでした。

次に、ハンドルを使用してみましたが、失敗したStorageFileで他のアクティビティは表示されませんでした。

だから今のところ、私はまだ困惑しています。

于 2013-03-23T15:07:17.297 に答える