使用 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 文件

使用 ZipOutPutStream Java 压缩(zip)文件列表

如何在 Spring MVC 中将字节数组转换为 ZipOutputStream?