我使用DotNetZip 1.9.3库,并且在使用BZip2和AES256时遇到了问题,这两种方法都适用于一个存档中的一个条目。ZipOutputStream工作正常,但是ZipInputStream错了BZip2头。如果我使用通用压缩算法,一切都很好。
我创建了ZipOutputStream (从文件流):
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归档:
protected override Stream OnCreateStream(string path)
{
ZipInputStream stream = new ZipInputStream(base.OnCreateStream(path))
{
Password = this.Password
};
var entry = stream.GetNextEntry();
return stream;
}如果取消注释压缩方法并尝试读取ZipInputStream,则会得到异常:
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)有什么想法吗?
发布于 2015-05-21 12:33:16
我知道这是一个很老的话题,但对于搜索解决方案的人来说,这可能还是很有用的。
我注意到调用压缩的属性设置程序的顺序很重要。使用
zip.CompressionMethod = CompressionMethod.BZip2;
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;设置在AddEntry之前,使DotNetZip无法读取ZIP文件。设置CompressionMethod和CompressionLevel的正确位置就在保存之前:
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();
}发布于 2014-06-21 22:16:54
这可能暗示了问题所在:
和gzip一样,bzip2只是一个数据压缩器。它不是像tar或ZIP那样的归档程序;该程序本身没有用于多个文件、加密或归档拆分的功能,但是在UNIX传统中,这些任务依赖于独立的外部实用程序,如tar和GnuPG。
来源:维基百科
https://stackoverflow.com/questions/24328239
复制相似问题