我使用 DotNetZip 1.9.3 库,并且在使用 BZip2 和 AES256 处理 1 个存档中的 1 个条目时遇到了问题。 ZipOutputStream 工作正常,但 ZipInputStream 获取错误的 BZip2 header 。如果我使用常见的放气算法,一切都很好。
我创建 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)
有什么想法吗?
最佳答案
我知道这是一个很老的话题,但对于那些在谷歌上搜索解决方案的人来说可能仍然有用。
我注意到调用压缩属性 setter 的顺序很重要。与
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();
}
关于c# - DotNetZip ZipInputStream 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328239/