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

C#内存创建ZipArchive保存至磁盘为空,求问题排查

解决ZipArchive生成空文件的问题

你的代码有两个关键问题导致生成的zip文件为空:

  • ZipArchive未完成写入:ZipArchive在Create模式下,只会在被释放(调用Dispose)时,才会把归档的元数据、条目内容完整写入到底层的archiveStream中。你的代码里没有用using包裹ZipArchive,导致归档操作未完成就开始复制流。
  • MemoryStream位置未重置:写入数据后的archiveStream的Position停在流的末尾,直接调用CopyTo会从末尾开始读取,自然读不到内容。

修复后的代码

var data = new Data
{
    FirstName = "FirstName",
    LastName = "LastName"
};

var json = JsonConvert.SerializeObject(data, Formatting.Indented);
var bytes = Encoding.UTF8.GetBytes(json);
using var file = new MemoryStream(bytes);

using var archiveStream = new MemoryStream();
// 用using包裹ZipArchive,确保Dispose时完成归档写入
using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
{
    var archiveEntry = archive.CreateEntry("data.json", CompressionLevel.Fastest);
    using var entryStream = archiveEntry.Open();
    file.CopyTo(entryStream);
}
// 重置流的位置到起始处
archiveStream.Position = 0;

using var fileStream = new FileStream("/Path/To/File/test.zip", FileMode.Create, FileAccess.Write);
archiveStream.CopyTo(fileStream);

关键说明

  1. 用using块包裹ZipArchive:当代码离开这个using块时,ZipArchive会自动调用Dispose,此时它会把所有条目数据和归档结构写入archiveStream。
  2. 重置archiveStream.Position为0:确保后续的CopyTo操作从流的起始位置读取数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:16:15