【问题标题】:Exception when using ZipOutputStream and FileStream to zip files使用 ZipOutputStream 和 FileStream 压缩文件时出现异常
【发布时间】: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

标签: c# file zip


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2020-07-04
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多