我正在为现有的C#(4.0)应用程序开发一个额外的模块,该应用程序使用Ionic Zip库来管理数据。在我的模块中,我需要从zip文件加载数据,操作它们,然后再写回来。我的例程在单元测试中运行正常,但是当从主机应用程序中调用时,它会抛出异常读取“进程无法访问该文件,因为它正被另一个进程使用”。当我尝试调用Zip存档的Save()
函数时,会发生这种情况。
我检查了哪个进程实际锁定了文件,它恰好是应用程序本身。因此,我得出结论,主机程序可能存在某种干扰:例如:在某个地方打开但未关闭的文件流。 (顺便说一句,是否有一些聪明的技术来照顾这些地方?)
令我困惑的是,在处理文件时,这些ZipFile的Ionic是否真的锁定/解锁文件,如下面的代码片段所示:
ZipFile zf = new ZipFile("test01.zip");
zf.Save();
// FileSystemTools.WhoIsLocking is a utility showing a list pf processes
// holding access to a given file
// Similar to http://stackoverflow.com/questions/1304/how-to-check-for-file-lock/20623302#20623302
List<Process> processes = FileSystemTools.WhoIsLocking("test01.zip");
Assert.That(processes.Count == 1);
zf.Dispose();
processes = FileSystemTools.WhoIsLocking("test01.zip");
Assert.That(processes.Count == 0);
Save()
锁定进程的数量为1(正在运行的进程本身),但在Dispose()
之后没有,这证明了Ionic.ZipFile显然在内部保存了一些文件流并以某种方式管理它们。但是,在其他地方,Dispose()
没有效果:锁定过程的数量不会减少。 Iconic.Zip文档很少且难以置信。