gpt4 book ai didi

c# - 从字节(具有任意编码的文本)在内存中创建 zip 文件

转载 作者:行者123 更新时间:2023-12-03 19:48:39 26 4
gpt4 key购买 nike

我正在开发的应用程序需要将 xml 文件压缩为 zip 文件,并通过 http 请求将它们发送到 Web 服务。由于我不需要保留 zip 文件,我只是在内存中执行压缩。 Web 服务拒绝了我的请求,因为 zip 文件显然格式不正确。

我知道 this question 中有一个解决方案效果很好,但它使用了 StreamWriter .我对该解决方案的问题是 StreamWriter需要编码或假设 UTF-8 ,而且我不需要知道 xml 文件的编码。我只需要从这些文件中读取字节,并将它们存储在一个 zip 文件中,无论它们使用什么编码。

所以,要明确的是,这个问题与编码无关,因为我不需要将字节转换为文本或对立。我只需要压缩一个 byte[] .

我正在使用下一个代码来测试我的 zip 文件是如何畸形的:

static void Main(string[] args)
{
Encoding encoding = Encoding.GetEncoding("ISO-8859-1");

string xmlDeclaration = "<?xml version=\"1.0\" encoding=\"" + encoding.WebName.ToUpperInvariant() + "\"?>";
string xmlBody = "<Test>ª!\"·$%/()=?¿\\|@#~€¬'¡º</Test>";
string xmlContent = xmlDeclaration + xmlBody;
byte[] bytes = encoding.GetBytes(xmlContent);
string fileName = "test.xml";
string zipPath = @"C:\Users\dgarcia\test.zip";

Test(bytes, fileName, zipPath);
}

static void Test(byte[] bytes, string fileName, string zipPath)
{
byte[] zipBytes;

using (var memoryStream = new MemoryStream())
using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, leaveOpen: false))
{
var zipEntry = zipArchive.CreateEntry(fileName);
using (Stream entryStream = zipEntry.Open())
{
entryStream.Write(bytes, 0, bytes.Length);
}

//Edit: as the accepted answer states, the problem is here, because i'm reading from the memoryStream before disposing the zipArchive.
zipBytes = memoryStream.ToArray();
}

using (var fileStream = new FileStream(zipPath, FileMode.OpenOrCreate))
{
fileStream.Write(zipBytes, 0, zipBytes.Length);
}
}

如果我尝试打开该文件,则会收到“意外的文件结尾”错误。显然,Web 服务正确报告了格式错误的 zip 文件。到目前为止我尝试过的:
  • 冲洗entryStream .
  • 关闭 entryStream .
  • 冲洗和关闭 entryStream .

  • 请注意,如果我打开 zipArchive直接来自 fileStream zip文件的形成没有错误。然而, fileStream只是作为测试存在,我需要在内存中创建我的 zip 文件。

    最佳答案

    您正在尝试从 MemoryStream 获取字节为时过早,ZipArchive还没有全部写出来。相反,请这样做:

    using (var memoryStream = new MemoryStream()) {
    // note "leaveOpen" true, to not dispose memoryStream too early
    using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, leaveOpen: true)) {
    var zipEntry = zipArchive.CreateEntry(fileName);
    using (Stream entryStream = zipEntry.Open()) {
    entryStream.Write(bytes, 0, bytes.Length);
    }
    }
    // now, after zipArchive is disposed - all is written to memory stream
    zipBytes = memoryStream.ToArray();
    }

    关于c# - 从字节(具有任意编码的文本)在内存中创建 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48927574/

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