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

时间:2013-03-15 00:50:45

标签: windows-8 windows-runtime dotnetzip

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

    很奇怪,是吗?它有点像可能是与File System Tunneling相关的错误,或者可能是DotNetZip执行并保留资源(可能重命名TEMP文件)的一些内部缓存,即使在ZipFile处理完毕后也是如此?

1 个答案:

答案 0 :(得分:0)

尝试(不成功)回答我自己的问题。

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

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

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

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

应该提供一种解决方案,但事实并非如此。

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

所以现在,我仍然难过。