通常,您會得到一個 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 存檔的步驟。

以下代碼示例展示瞭如何在 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 的信息。此外,您可以通過我們的 論壇 與我們分享您的疑問。

也可以看看