带有内存数据 dotnet 的 ZipArchive

问题描述 投票:0回答:1

我正在尝试使用在内存中创建的数据在 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);

我错过了什么?

c# .net ziparchive
1个回答
0
投票

正如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);
© www.soinside.com 2019 - 2024. All rights reserved.