首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DotNetZip ZipInputStream问题

DotNetZip ZipInputStream问题
EN

Stack Overflow用户
提问于 2014-06-20 13:18:26
回答 2查看 2.6K关注 0票数 2

我使用DotNetZip 1.9.3库,并且在使用BZip2和AES256时遇到了问题,这两种方法都适用于一个存档中的一个条目。ZipOutputStream工作正常,但是ZipInputStream错了BZip2头。如果我使用通用压缩算法,一切都很好。

我创建了ZipOutputStream (从文件流):

代码语言:javascript
复制
protected override Stream OnCreateStream(string path)
{
    var encryptedStream = new ZipOutputStream(base.OnCreateStream(path))
    {
        Password = this.Password,
        Encryption = EncryptionAlgorithm.WinZipAes256,
   //     CompressionMethod = CompressionMethod.BZip2,
    };
    var entry = encryptedStream.PutNextEntry("_");
    return encryptedStream;
}

工作完成后,我总是把ZipOutputStream处理掉。

流读取zip归档:

代码语言:javascript
复制
protected override Stream OnCreateStream(string path)
{
    ZipInputStream stream = new ZipInputStream(base.OnCreateStream(path))
    {
        Password = this.Password
    };
    var entry = stream.GetNextEntry();
    return stream;
}

如果取消注释压缩方法并尝试读取ZipInputStream,则会得到异常:

代码语言:javascript
复制
Not a valid BZip2 stream. byte 1, expected '90', got '107'
   в Ionic.BZip2.BZip2InputStream.CheckMagicChar(Char expected, Int32 position)
   в Ionic.BZip2.BZip2InputStream.init()
   в Ionic.BZip2.BZip2InputStream..ctor(Stream input, Boolean leaveOpen)
   в Ionic.Zip.ZipEntry.GetExtractDecompressor(Stream input2)
   в Ionic.Zip.ZipEntry.InternalOpenReader(String password)
   в Ionic.Zip.ZipInputStream.SetupStream()
   в Ionic.Zip.ZipInputStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   в System.IO.StreamReader.ReadBuffer(Char[] userBuffer, Int32 userOffset, Int32 desiredChars, Boolean& readToUserBuffer)
   в System.IO.StreamReader.Read(Char[] buffer, Int32 index, Int32 count)

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-21 12:33:16

我知道这是一个很老的话题,但对于搜索解决方案的人来说,这可能还是很有用的。

我注意到调用压缩的属性设置程序的顺序很重要。使用

代码语言:javascript
复制
zip.CompressionMethod = CompressionMethod.BZip2;
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;

设置在AddEntry之前,使DotNetZip无法读取ZIP文件。设置CompressionMethodCompressionLevel的正确位置就在保存之前:

代码语言:javascript
复制
using (var zip = new ZipFile(zipPath, Encoding.UTF8))
{
    // set zip properties except compression ones
    zip.Encryption = EncryptionAlgorithm.WinZipAes256;
    zip.Password = "pass";

    // add entries
    zip.AddEntry("whatever", stream);

    // set compression just before Save()
    zip.CompressionMethod = CompressionMethod.BZip2;
    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;

    zip.Save();
}
票数 2
EN

Stack Overflow用户

发布于 2014-06-21 22:16:54

这可能暗示了问题所在:

和gzip一样,bzip2只是一个数据压缩器。它不是像tar或ZIP那样的归档程序;该程序本身没有用于多个文件、加密或归档拆分的功能,但是在UNIX传统中,这些任务依赖于独立的外部实用程序,如tar和GnuPG。

来源:维基百科

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24328239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档