我正在尝试使用在内存中创建的数据在 C# 中创建 Zip 存档。然而,每次我尝试最终将存档保存到磁盘时,它都是空的。现在我正在使用一个文件进行测试,但它最终将成为一个将被存档的文件列表。
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();
var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true);
var archiveEntry = archive.CreateEntry("data.json", CompressionLevel.Fastest);
using var entryStream = archiveEntry.Open();
file.CopyTo(entryStream);
using var fileStream = new FileStream("/Path/To/File/test.zip", FileMode.Create, FileAccess.Write);
archiveStream.CopyTo(fileStream);
我错过了什么?
正如https://stackoverflow.com/a/17939367/14918126中提到的,问题是
archiveStream
需要先被处置才能使用它。
在将 archiveStream
复制到 fileStream 之前,您应该将其位置设置为开始位置。
以下解决方案应该有效:
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();
var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true);
var archiveEntry = archive.CreateEntry("data.json", CompressionLevel.Fastest);
using var entryStream = archiveEntry.Open();
file.CopyTo(entryStream);
archive.Dispose();
using var fileStream = new FileStream("./test2.zip", FileMode.Create, FileAccess.Write);
archiveStream.Seek(0, SeekOrigin.Begin);
archiveStream.CopyTo(fileStream);