.NET 5下DotNetZip解压加密zip报错,求可输出MemoryStream的替代Zip SDK
问题排查&可用替代方案
现有代码问题排查
你当前的代码存在逻辑缺陷:如果压缩包内包含多个文件,所有文件内容会被依次写入同一个MemoryStream,最终流内是多文件拼接的混合内容,本身就会导致格式识别错误。如果是单文件压缩包场景,你需要确保解压操作后重置流的起始位置;多文件场景需要为每个压缩条目单独初始化MemoryStream存储内容。
可用替代SDK
1. SharpZipLib(ICSharpCode.SharpZipLib)
这是.NET生态应用最广泛的开源ZIP处理库之一,完美兼容.NET 5,支持传统ZIP加密、AES加密,全场景支持流操作,无需本地文件落地。
带密码解压到MemoryStream示例:
using ICSharpCode.SharpZipLib.Zip; // Zipfile为压缩包输入流 using var zipInputStream = new ZipInputStream(Zipfile); zipInputStream.Password = Password; ZipEntry entry; while ((entry = zipInputStream.GetNextEntry()) != null) { if (!entry.IsFile) continue; // 每个文件单独创建内存流存储 using var fileStream = new MemoryStream(); byte[] buffer = new byte[4096]; int readCount; while ((readCount = zipInputStream.Read(buffer, 0, buffer.Length)) > 0) { fileStream.Write(buffer, 0, readCount); } // 重置流位置即可使用解压后的内容 fileStream.Position = 0; }
创建带密码压缩包输出到MemoryStream示例:
using var outputStream = new MemoryStream(); using var zipOutputStream = new ZipOutputStream(outputStream); zipOutputStream.Password = YourPassword; zipOutputStream.SetLevel(5); // 压缩等级0-9,数值越高压缩率越高 // 添加文件到压缩包 var entry = new ZipEntry("test.txt"); zipOutputStream.PutNextEntry(entry); // 写入待压缩的内容 byte[] fileContent = System.Text.Encoding.UTF8.GetBytes("测试内容"); zipOutputStream.Write(fileContent, 0, fileContent.Length); zipOutputStream.CloseEntry(); zipOutputStream.Finish(); // 重置流位置即可获取最终压缩包内存流 outputStream.Position = 0;
2. ZipStorer
轻量单文件ZIP处理库,无额外依赖,支持密码加密,适配.NET Standard 2.0,完美兼容.NET 5,API简洁易用,原生支持流输入输出。
内容的提问来源于stack exchange,提问作者blackowl
相关产品推荐
相关产品推荐

