gpt4 book ai didi

c# - 无需磁盘 IO 直接从对象创建 zip 文件

转载 作者:太空狗 更新时间:2023-10-30 00:07:15 25 4
gpt4 key购买 nike

我正在编写一个 REST API,它将接收一个 JSON 请求对象。请求对象必须序列化为 JSON 格式的文件;该文件必须压缩成一个 zip 文件,并且必须将 ZIP 文件发布到另一个服务,为此我必须反序列化 ZIP 文件。这一切都是因为我必须调用的服务希望我将数据作为 ZIP 文件发布。我正在尝试查看是否可以避免磁盘 IO。有没有一种方法可以直接将对象转换为表示内存中 ZIP 内容的字节数组,而不是上述所有步骤?

注意:我更喜欢使用 .net 框架库(相对于外部库)来完成此任务

最佳答案

是的,可以完全在内存中创建一个 zip 文件,这里是一个使用 SharpZip 的例子库(更新:使用 ZipArchive 的示例添加在末尾 ):

public static void Main()
{
var fileContent = Encoding.UTF8.GetBytes(
@"{
""fruit"":""apple"",
""taste"":""yummy""
}"
);


var zipStream = new MemoryStream();
var zip = new ZipOutputStream(zipStream);

AddEntry("file0.json", fileContent, zip); //first file
AddEntry("file1.json", fileContent, zip); //second file (with same content)

zip.Close();

//only for testing to see if the zip file is valid!
File.WriteAllBytes("test.zip", zipStream.ToArray());
}

private static void AddEntry(string fileName, byte[] fileContent, ZipOutputStream zip)
{
var zipEntry = new ZipEntry(fileName) {DateTime = DateTime.Now, Size = fileContent.Length};
zip.PutNextEntry(zipEntry);
zip.Write(fileContent, 0, fileContent.Length);
zip.CloseEntry();
}

可以获得SharpZip使用 Nuget 命令 PM> Install-Package SharpZipLib

更新:

Note : I'd prefer accomplishing this using .net framework libraries (as against external libraries)

这是一个使用内置 ZipArchive 的示例来自 System.IO.Compression.Dll

public static void Main()
{
var fileContent = Encoding.UTF8.GetBytes(
@"{
""fruit"":""apple"",
""taste"":""yummy""
}"
);

var zipContent = new MemoryStream();
var archive = new ZipArchive(zipContent, ZipArchiveMode.Create);

AddEntry("file1.json",fileContent,archive);
AddEntry("file2.json",fileContent,archive); //second file (same content)

archive.Dispose();

File.WriteAllBytes("testa.zip",zipContent.ToArray());
}


private static void AddEntry(string fileName, byte[] fileContent,ZipArchive archive)
{
var entry = archive.CreateEntry(fileName);
using (var stream = entry.Open())
stream.Write(fileContent, 0, fileContent.Length);

}

关于c# - 无需磁盘 IO 直接从对象创建 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27483065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com