You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 19:57:03