提问人:Dblock247 提问时间:11/10/2023 更新时间:11/10/2023 访问量:68
具有内存数据 dotnet 的 ZipArchive
ZipArchive with in memory data dotnet
问:
我正在尝试使用在内存中创建的数据在 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);
我错过了什么?
答:
1赞
beautifulcoder
11/10/2023
#1
写入内存流后,您将需要返回到内存流的开头。
archiveStream.Seek(0, SeekOrigin.Begin);
archiveStream.CopyTo(fileStream);
2赞
Schamal
11/10/2023
#2
如 https://stackoverflow.com/a/17939367/14918126 所述,问题在于需要先处理掉它,然后才能使用它。
在将 它复制到 fileStream 之前,您应该将 的位置设置为开始。
以下解决方案应该有效:archiveStream
archiveStream
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);
评论
0赞
Dblock247
11/10/2023
感谢您的回复。我确实看到了那篇帖子,但大多数答案都没有显示处置。我一定错过了。道歉。
评论