2013-03-15 49 views
1

在Windows8中,我試圖使用GetBasicPropertiesAsync()來獲取新創建文件的大小。 有時,但並非總是如此(〜的25%的時間),這個調用給出了一個例外:爲什麼GetBasicPropertiesAsync()有時會拋出異常?

"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. 沒有觀看使用文件資源管理器

怪異的目錄,是吧?它聞起來可能是一個與File System Tunneling相關的錯誤,或者可能是DotNetZip在執行並保存資源(甚至可能重命名TEMP文件)後的一些內部緩存,即使ZipFile被丟棄後也是如此?

+2

E_ACCESSDENIED最有可能表示正在使用的文件,雖然看着你的代碼我不知道爲什麼。也許你可以嘗試使用[Handle](http://technet.microsoft.com/en-US/sysinternals/bb896655)來幫助你診斷問題。 – 2013-03-15 05:41:41

回答

0

試圖(不成功)回答我自己的問題。

起初,我雖然這是一個已知的問題,DotNetZip持有文件句柄,直到下一次垃圾收集。我使用DotNetZip的SL/WP7端口從http://slsharpziplib.codeplex.com/這大概不包括由該工作項固定的bug:

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

但是,根據這一理論,這樣做的:

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

應該提供了一個解決方法,而不是。

接下來,我嘗試使用句柄,它沒有顯示有關存在故障的StorageFile上的任何其他活動。

所以現在,我仍然難倒了。

+0

要做一個真正的集合,你需要再次運行GC.Collect() - 在WaitForPendingFinalizers之後,refs仍然沒有從堆中清除。因此:GC.Collect/GC.Wait/GC.Collect用於真正的完整GC。 – 2016-06-05 09:52:35

相關問題