在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!
一些显然随机的事情似乎降低了异常的可能性:
很奇怪,是吗?它有点像可能是与File System Tunneling相关的错误,或者可能是DotNetZip执行并保留资源(可能重命名TEMP文件)的一些内部缓存,即使在ZipFile处理完毕后也是如此?
答案 0 :(得分:0)
尝试(不成功)回答我自己的问题。
起初,我认为这是一个已知的问题,DotNetZip保留到文件句柄,直到下一次垃圾收集。我正在使用来自http://slsharpziplib.codeplex.com/的DotNetZip的SL / WP7端口,可能不包括此工作项修复的错误:
http://dotnetzip.codeplex.com/workitem/12727
但是,根据那个理论,做:
GC.Collect();
GC.WaitForPendingFinalizers();
应该提供一种解决方案,但事实并非如此。
接下来我尝试使用句柄,它没有在失败的StorageFile上显示任何其他活动。
所以现在,我仍然难过。