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);
关键说明
- 用
using块包裹ZipArchive:当代码离开这个using块时,ZipArchive会自动调用Dispose,此时它会把所有条目数据和归档结构写入archiveStream。 - 重置
archiveStream.Position为0:确保后续的CopyTo操作从流的起始位置读取数据。
内容的提问来源于stack exchange,提问作者Dblock247
相关产品推荐
相关产品推荐

