使用 ZipOutputStream 和 FileStream 压缩文件时出现异常
Posted
技术标签:
【中文标题】使用 ZipOutputStream 和 FileStream 压缩文件时出现异常【英文标题】:Exception when using ZipOutputStream and FileStream to zip files 【发布时间】:2016-07-21 17:09:24 【问题描述】:我每隔几秒钟创建几个备份文件,以确保我的系统的完整性(要求)。
因为文件很多,所以我使用 ZipOutputStream 压缩文件并节省一些磁盘空间。但是,当代码到达 File.OpenRead(filename) 时,会抛出以下异常:
该进程无法访问文件“inputfilefullnamehere”,因为它正被另一个进程使用。
我认为这正是 ZipOutputStream,所以我尝试在打开 FileStream 之前关闭它,但随后我在 StreamUtils.Copy() 中遇到另一个异常,说没有打开任何条目。
我有什么遗漏的吗?
我的代码是:
byte[] buffer = new byte[4096];
ZipOutputStream s = new ZipOutputStream(File.Create(filename+ ".his"));
s.SetLevel(9); // 0 - store only to 9 - means best compression
ZipEntry entry = new ZipEntry(filename+ ".his");
s.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(filename+ ".his"))
StreamUtils.Copy(fs, s, buffer);
s.Close();
File.Delete(filename);
【问题讨论】:
您的 zip 文件的名称不应该与您正在压缩的文件的名称不同,例如filename + ".his.zip"
?
代码的第二行,你打开一个文件,但从不关闭它。然后你尝试再次打开它。繁荣。我会整理一个答案,但试图猜测容易出错的文件名的意图是很棘手的。
什么是 ZipOutputStream 类?在 .NET 中找不到它。
@spender 我不是写这段代码的人,我只是负责解决问题的人。我和你一样困惑。但我同意这个问题取决于创建文件而不是关闭它,尽管如果我也在压缩它,我真的不知道什么时候这样做。
@mehrzad 它是 ICSharpCode.SharpZipLib 库的一部分 github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples
【参考方案1】:
您需要将源文件的路径(文件名)传递给File.OpenRead
方法,而不是目标路径。由于您尝试读取已打开写入的目标文件,因此您收到拒绝访问错误。
string sourceFileName = filename;
string destFileName = string.Format("0.his", filename);
using (ZipOutputStream s = new ZipOutputStream(File.Create(destFileName))
s.SetLevel(9); // 0 - store only to 9 - means best compression
ZipEntry entry = new ZipEntry(filename);
s.PutNextEntry(entry);
using (FileStream fs = File.OpenRead(sourceFileName))
byte[] buffer = new byte[4096];
StreamUtils.Copy(fs, s, buffer);
s.Close();
File.Delete(filename);
【讨论】:
以上是关于使用 ZipOutputStream 和 FileStream 压缩文件时出现异常的主要内容,如果未能解决你的问题,请参考以下文章
[源码]ObjectIOStream 对象流 ByteArrayIOStream 数组流 内存流 ZipOutputStream 压缩流
使用 Java ZipOutputStream 和 BufferedOutputStream 的首选方式
ZipOutputStream 类的 closeEntry()
ZipOutputStream 在 Android 上生成损坏的 zip 文件