.net ZipArchive与内存数据dotnet

wnrlj8wa  于 11个月前  发布在  .NET
关注(0)|答案(2)|浏览(88)

我试图在C#中创建一个Zip Archive,其中的数据是在内存中创建的。然而,每次我试图最终将存档保存到磁盘时,它都是空的。现在我正在测试一个文件,但它最终将成为一个将被存档的文件列表。

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);

字符串
我错过了什么?

bq9c1y66

bq9c1y661#

正如在https://stackoverflow.com/a/17939367/14918126中提到的,问题是archiveStream需要在使用它之前进行处理。在将其复制到fileStream之前,您应该将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);

字符串

q5lcpyga

q5lcpyga2#

一旦写入内存流,您需要返回到内存流的开头。

archiveStream.Seek(0, SeekOrigin.Begin);
archiveStream.CopyTo(fileStream);

字符串

相关问题