通常,您会得到一个 ZIP 存档,其中包含其他 ZIP 存档,形成存档的嵌套结构。在这种情况下,您可能希望通过将所有内部 ZIP 档案提取到外部档案中来获得扁平结构。为了以编程方式执行此操作,本文展示了如何在 C# 中创建平面 ZIP 存档。

C# .NET API 创建平面 ZIP 档案

要创建平面 ZIP 档案,我们将使用 Aspose.ZIP for .NET。它是一个归档 API,旨在创建和提取流行的归档格式,包括 ZIP、TAR、GZip 和 7z。您可以从 NuGet 安装 API,也可以从 下载部分 下载其 DLL。

PM> Install-Package Aspose.Zip

在 C# 中创建平面 ZIP 存档

要了解平面 ZIP 存档的结构,让我们举个例子。以下是一个 ZIP 存档,其中包含另一个 ZIP 存档。

parent.zip
 ├first.txt
 ├inner.zip
 │ ├game.exe
 │ └subitem.bin
 └picture.gif

将此 ZIP 存档转换为平面 ZIP 后,内部 ZIP 的所有条目都将被提取到父 ZIP 中。最后,我们将得到父 ZIP 的以下结构。

flatten.zip
 ├first.txt
 ├picture.gif
 ├game.exe
 └subitem.bin

让我们看看如何以编程方式执行此转换。以下是在 C# 中创建平面 ZIP 存档的步骤。

以下代码示例展示了如何在 C# 中创建平面 ZIP 存档。

// 加载 ZIP 存档
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
    // 创建一个列表以在提取后删除内部 ZIP 条目
    List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();

    // 创建一个列表以在内部 ZIP 档案中添加文件名
    List<string> namesToInsert = new List<string>();

    // 创建一个列表以在内部 ZIP 档案中添加文件的流对象
    List<MemoryStream> contentToInsert = new List<MemoryStream>();

    // 循环遍历父 ZIP 中的条目
    foreach (ArchiveEntry entry in outer.Entries)
    {
        // 检查条目是否为 ZIP 文件
        if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) 
        {
            // 将条目添加到列表以保留参考,以便以后将其从存档中删除
            entriesToDelete.Add(entry); 

            // 创建流对象以打开 ZIP 存档
            MemoryStream innerCompressed = new MemoryStream();
            entry.Open().CopyTo(innerCompressed);

            // 从流对象加载 ZIP 存档 
            using (Archive inner = new Archive(innerCompressed))
            {
                // 循环归档的条目
                foreach (ArchiveEntry ie in inner.Entries) 
                {
                    // 将条目名称保留在列表中
                    namesToInsert.Add(ie.Name); 

                    // 将归档条目提取到流对象中
                    MemoryStream content = new MemoryStream();
                    ie.Open().CopyTo(content);

                    // 将条目添加到列表
                    contentToInsert.Add(content);
                }
            }
        }
    }

    // 删除内部 ZIP 档案
    foreach (ArchiveEntry e in entriesToDelete)
        outer.DeleteEntry(e);

    // 将内部 ZIP 档案的文件插入父 ZIP 档案
   for (int i = 0; i < namesToInsert.Count; i++)
        outer.CreateEntry(namesToInsert[i], contentToInsert[i]);

    outer.Save("Archives/flatten.zip");
}

获取免费 API 许可证

您可以获得 免费的临时许可证 以使用 Aspose.ZIP for .NET,而不受评估限制。

结论

在本文中,您学习了如何在 C# 中以编程方式创建平面 ZIP 存档。特别是,我们已经演示了如何通过将内部 ZIP 档案提取到父 ZIP 中来制作平面 ZIP。除此之外,您可以访问 文档 以阅读有关 Aspose.ZIP for .NET 的更多信息。此外,您可以通过我们的 论坛 与我们分享您的疑问。

也可以看看