为什么GetBasicPropertiesAsync()有时会抛出异常



在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. 未使用文件资源管理器查看目录

奇怪,嗯?它闻起来可能是与文件系统隧道相关的错误,或者可能是DotNetZip正在执行的一些内部缓存并保留资源(可能重命名TEMP文件),即使在ZipFile被处置之后?

试着(不成功地)回答我自己的问题

起初,我认为这是DotNetZip在下一次垃圾收集之前持有文件句柄的已知问题。我正在使用来自http://slsharpziplib.codeplex.com/的DotNetZip的SL/WP7端口,该端口可能不包括此工作项修复的错误:

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

但是,根据这个理论,做:

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

应该提供一个解决方法,但它没有。

接下来,我尝试使用句柄,它没有显示失败的StorageFile上的任何其他活动。

现在,我还是很困惑

最新更新