【问题标题】:Get byte array for ZipArchive in C#在 C# 中获取 ZipArchive 的字节数组
【发布时间】:2021-09-03 00:27:12
【问题描述】:

我正在尝试编写代码以从 zip 存档中删除 _MAXOSX 文件夹(如果存在)(如果存在则进一步中断验证)。

代码必须返回 byte[] 而不是 ZipArchive 本身。我目前拥有的代码是:

var fileBytes = uploadController.FileBytes;
if (stripMacOSXFolder && uploadController.FileName.EndsWith(".zip", StringComparison.CurrentCultureIgnoreCase))
{
    try
    {
        using (var data = new MemoryStream(fileBytes))
        using (var archive = new ZipArchive(data, ZipArchiveMode.Update))
        {
            var osx = archive.Entries.SingleOrDefault(c =>
                c.FullName.Equals("__MACOSX/", StringComparison.CurrentCultureIgnoreCase));
            if (osx != null)
            {
                osx.Delete();
                // SET fileBytes to archive byte[]
            }
        }
    }
    catch (Exception)
    {
        return new ObjectReturnMethodResult<UploadedFileV2>("Uploaded zip appears to be invalid.");
    }
}

删除条目后,我不清楚如何将fileBytes 设置为更新后的 ZipArchive 的字节数组。

【问题讨论】:

  • Ata 猜测:fileBytes = data.ToArray(); 我假设它会更新流。
  • @Llama 不幸的是在osx.Delete(); 之后如果我添加fileBytes = data.ToArray(); 它似乎不起作用 - 该文件夹没有从存档中删除。
  • 您是在 ZipArchive 被处置后这样做的吗?如果你是在里面做的,那么它可能没有写入更改。
  • 啊,docs 似乎支持这个理论:“当你将模式设置为更新时,底层文件或流必须支持读、写和查找。整个存档保存在内存中,并且在处理存档之前不会将数据写入基础文件或流。"

标签: c# arrays ziparchive


【解决方案1】:

docs for Update 模式状态:

当您将模式设置为更新时,底层文件或流必须支持读取、写入和查找。 整个存档的内容保存在内存中,在处理存档之前,不会将任何数据写入基础文件或流。

看来您需要在处理掉ZipArchive 后获取更新字节:

using (var data = new MemoryStream(fileBytes))
{
    using (var archive = new ZipArchive(data, ZipArchiveMode.Update))
    {
        var osx = archive.Entries.SingleOrDefault(c =>
            c.FullName.Equals("__MACOSX/", StringComparison.CurrentCultureIgnoreCase));
        if (osx != null)
        {
            osx.Delete();
        }
    }
    fileBytes = data.ToArray();
}

【讨论】:

  • ZipArchive 是一个奇怪的野兽!我之前因为不处理而被抓住了。
  • 非常感谢,我在代码中犯的一个错误是删除条目方法会删除根文件夹条目而不是子条目,因此您必须在删除时循环每个条目,这也有点不很明显:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多