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

C#如何读取zip.001等多卷压缩文件,支持ó、ć等特殊字符解析

问题解答

1. 读取zip.001、zip.002格式分卷压缩包的方法

.NET 内置的System.IO.Compression.ZipFile/ZipArchive原生不支持拆分式分卷压缩包(后缀为.zip.001、.zip.002的跨文件分片zip),仅支持单文件zip,所以你原来用ZipFile.OpenRead直接打开分卷文件无法识别。
有两种可选解决方案:

  • 方案1:手动合并分卷后读取
    按数字从小到大的顺序,把所有分卷文件(.001、.002直到最后一个分片)的二进制流拼接成完整的MemoryStream或临时单文件,再用ZipArchive加载合并后的流即可读取内容,注意合并顺序不能打乱。
  • 方案2:用第三方压缩类库直接读取
    SharpZipLib、DotNetZip等常用C#压缩类库都原生支持读取分卷zip,不需要手动合并分片,直接指定第一个分卷文件(.001)的路径就能加载整个压缩包内容。
    以DotNetZip为例的示例代码:
// 先安装DotNetZip的NuGet包
using (ZipFile zip = ZipFile.Read(openFileDialog1.FileName))
{
    foreach (ZipEntry entry in zip)
    {
        // 后续读取条目逻辑和原有逻辑基本一致
    }
}

2. 读取包含ó、ć、ę、ł等特殊字符的内容

原生ZipArchive默认用UTF-8解析文件名,如果你的压缩包是用东欧地区编码(比如你代码里提到的CP852、CP1250)打包的,就会出现乱码。
你原有代码里的编码转换逻辑是错误的:你是先拿到ZipArchive已经按默认编码解析后的字符串再转编码,这时候乱码已经产生,转换不会生效。正确的做法是加载压缩包时就指定对应文件名编码:

// 加载压缩包时直接指定编码为CP852,不需要事后转码
using (var stream = File.OpenRead(openFileDialog1.FileName))
using (ZipArchive zip = new ZipArchive(stream, ZipArchiveMode.Read, false, Encoding.GetEncoding("CP852")))
{
    listBox1.Items.Clear();
    foreach (ZipArchiveEntry entry in zip.Entries)
    {
        // 这里entry.FullName已经是正确解码后的特殊字符
        listBox1.Items.Add(entry.FullName);
        listBox1.ForeColor = Color.FromArgb(1, 150, 227);
    }
}

如果你用第三方类库处理分卷,也可以在加载压缩包时指定对应编码参数,即可同时解决分卷读取和特殊字符解析的问题。

内容的提问来源于stack exchange,提问作者Lobo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:18:00