在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!
一些看似随机的事情似乎降低了异常发生的可能性:
- 在循环开始前删除cr.ArchiveName的现有副本。
- 未使用文件资源管理器查看目录
奇怪,嗯?它闻起来可能是与文件系统隧道相关的错误,或者可能是DotNetZip正在执行的一些内部缓存并保留资源(可能重命名TEMP文件),即使在ZipFile被处置之后?
试着(不成功地)回答我自己的问题
起初,我认为这是DotNetZip在下一次垃圾收集之前持有文件句柄的已知问题。我正在使用来自http://slsharpziplib.codeplex.com/的DotNetZip的SL/WP7端口,该端口可能不包括此工作项修复的错误:
http://dotnetzip.codeplex.com/workitem/12727但是,根据这个理论,做:
GC.Collect();
GC.WaitForPendingFinalizers();
应该提供一个解决方法,但它没有。
接下来,我尝试使用句柄,它没有显示失败的StorageFile上的任何其他活动。
现在,我还是很困惑