我正在使用SharpZipLib中的类FastZip创建一个zip文件,一旦我关闭程序后,我无法删除该文件,因为:
“无法删除zip.zip:正在被其他人或程序使用。关闭所有可能正在使用该文件的程序,然后重试。”
生成文件的代码就是:
fZip.CreateEmptyDirectories = true;
fZip.CreateZip(filesPath + "\\" + this.zipName, filesPath, false, this.zipFilter);
我尝试使用:
using (FastZip fZip = new FastZip())
{
try
{
fZip.CreateEmptyDirectories = true;
fZip.CreateZip(filesPath + "\\" + this.zipName, filesPath, false, this.zipFilter);
}
catch (Exception)
{
}
}
但它不会转换为iDisposable
答案 0 :(得分:3)
看起来它可能是SharpZipLib的一个错误。 FastZip.CreateZip方法有三个重载,其中两个创建使用File.Create,如:
CreateZip(File.Create(zipFileName), // ...
它似乎没有关闭流,所以你可能最好使用:
string zipFileName = System.IO.Path.Combine(filesPath, this.zipName);
using (Stream stream = File.Create(zipFileName))
{
fZip.CreateZip(stream, filesPath, false, this.zipFilter, null);
stream.Close();
}
从技术上讲,你不需要在using块中调用Close,但我喜欢明确它。
答案 1 :(得分:3)
我其实刚刚解决了这个问题。事实证明它不是SharpZipLib / FastZip。我通过System.Net.Mail发送了一封电子邮件,并附上了FastZipped文件作为该电子邮件的附件。当我试图删除附件时,我遇到了你收到的错误。事实证明,我所要做的就是在发送电子邮件后调用MailMessage.Dispose()。
查看代码中可能锁定文件的任何其他项目;如果可能的话,尝试处理()或关闭()这些项目。
答案 2 :(得分:1)
答案 3 :(得分:0)
我对FastZip API并不熟悉(所以这只是一个平底船),但你需要用fZip.Close();
之类的东西关闭存档吗?我原本以为关闭程序会做同样的事情但只是猜测。
答案 4 :(得分:0)
确保在完成后关闭SharpZipLib 流,可以通过将其构造包装在“using”语句中来实现...
using(Stream s = new SharpZipLibStream())
{
/*...do stuff, zip stuff.../
}