通常,您會得到一個 ZIP 存檔,其中包含其他 ZIP 存檔,形成存檔的嵌套結構。在這種情況下,您可能希望通過將所有內部 ZIP 檔案提取到外部檔案中來獲得平面結構。為了以編程方式執行此操作,本文介紹瞭如何在 C# 中創建平面 ZIP 存檔。
用於創建平面 ZIP 存檔的 C# .NET API
要創建平面 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 的信息。此外,您可以通過我們的 論壇 與我們分享您的疑問。