通常,您会得到一个 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 存档的步骤。
- 首先,使用 Archive 类加载父 ZIP 存档。
- 然后,创建列表来存储要从父 ZIP 中删除的内部 ZIP 条目、提取的条目及其名称。
- 之后,使用 Archive.Entries 集合循环遍历父 ZIP 中的每个 ArchiveEntry。
- 对于每个条目,执行以下操作:
- 使用 ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) 方法检查条目是否为 ZIP 存档。
- 然后,将条目添加到要删除的条目列表中。
- 使用 ArchiveEntry.Open().CopyTo(MemoryStream) 方法打开 MemoryStream 对象的条目。
- 遍历内部 ZIP 存档的条目,并在每次迭代中执行以下步骤。
- 将条目名称添加到要添加的条目列表中。
- 然后,使用 ArchiveEntry.Open().CopyTo(MemoryStream) 方法将条目加载到 MemoryStream。
- 最后,将条目添加到要添加到父 ZIP 的条目列表中。
- 然后,遍历内部 ZIP 存档列表并使用 Archive.DeleteEntry(ArchiveEntry) 方法删除每个条目。
- 遍历要添加到父 ZIP 的条目列表,并使用 Archive.CreateEntry(String, Stream) 方法添加每个条目。
- 最后,使用 Archive.Save(String) 方法保存父 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 的更多信息。此外,您可以通过我们的 论坛 与我们分享您的疑问。