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

C#生成的Zip文件显示为空/损坏但可解压的修复求助

问题修复方案

问题原因

你遇到的问题是因为**ZipArchive尚未完成Zip文件的收尾写入**就读取了内存流内容。ZipArchive在被释放(Dispose)时才会写入Zip文件必需的目录结束标记和元数据,而你的代码在ZipArchive的作用域未结束时就将内存流写入文件,导致生成的Zip文件结构不完整,部分解压工具无法识别。

修复后的代码

static void Main(string[] args)
{
    var zipName = $"archive-{DateTime.Now:yyyy_MM_dd-HH_mm_ss}.zip";
    var folder = "D:\\xxdd";
    using var memoryStream = new MemoryStream();
    
    // 将ZipArchive的操作放入独立using块,确保Dispose时完成Zip文件写入
    using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
    {
        var files = Directory.GetFiles(folder);
        foreach (var file in files)
        {
            zipArchive.CreateEntryFromFile(file, Path.GetFileName(file));
        }
    } // 此处ZipArchive被释放,完成所有必要的Zip元数据写入
    
    memoryStream.Position = 0;
    File.WriteAllBytes(zipName, memoryStream.ToArray());
    Console.WriteLine("Zip文件生成完成");
}

关键改动说明

  • 将ZipArchive的声明改为带块的using语句,而非using var。这样当代码执行到块结束时,ZipArchive会立即被释放,完成Zip文件的收尾工作,确保内存流中包含完整的Zip文件数据。
  • 只有在ZipArchive释放后,再读取内存流并写入本地文件,生成的Zip文件才符合标准格式,所有解压工具都能正常识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:12:31