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

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

4

1 回答 1

0

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

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

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

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

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

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

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

所以现在,我仍然很难过。

于 2013-03-23T15:07:17.297 回答