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
相关产品推荐
相关产品推荐

