在 .NET 中從 ZIP 擷取 C++ 內容

使用 Aspose.ZIP for .NET 檢查 ZIP 封存,並只還原 C# 應用程式所需的 C++ 檔案。在本頁中,擷取是指從 ZIP 容器中選取 .cpp 檔案並寫入受控目的地;Aspose.ZIP 不會解譯或轉換檔案的內部內容。

選擇性擷取適用於文件匯入、媒體資產、工程資料、專案套件和自動化內容處理。應用程式可以略過無關項目,執行輸出與資源原則,並在不展開完整封存的情況下將已核准的檔案傳遞給下一階段。

如何使用 C# 從 ZIP 擷取 C++ 檔案

安裝 Aspose.ZIP for .NET 套件 並匯入 Aspose.Zip 命名空間。寫入任何內容之前即可取得封存中繼資料,因此應用程式可以將 ArchiveEntry.Name、ArchiveEntry.IsDirectory 和 ArchiveEntry.UncompressedSize 作為接受原則的一部分進行評估。


Package Manager Console Command

PM> Install-Package Aspose.Zip

使用 Archive 開啟 ZIP,列舉 Archive.Entries,選取副檔名為 .cpp 的項目,並對每個已核准的目的地呼叫 ArchiveEntry.Extract。範例會將封存路徑縮減為最終檔名,使項目無法離開目標目錄。

在 C# 中還原 C++ 檔案的步驟

  • 解析來源 ZIP 路徑並建立隔離的輸出目錄。
  • 使用 Archive 類別開啟套件。
  • 列舉 Archive.Entries,而不是展開每個項目。
  • 選取最終檔名使用 .cpp 副檔名的項目。
  • 建立一律位於已核准輸出根目錄下的目的地路徑。
  • 拒絕超過已設定解壓縮後大小限制的項目。
  • 使用 ArchiveEntry.Extract 儲存每個已接受的項目。

系統需求

執行範例之前,請確認環境包含:

  • Windows、Linux 或 macOS 上支援的 .NET 執行階段。
  • Visual Studio、JetBrains Rider、Visual Studio Code 或其他 C# 開發環境。
  • 透過 NuGet 安裝或作為組件參考的 Aspose.ZIP for .NET。
  • 對來源封存的讀取權限以及對目的地目錄的寫入權限。
  • 適合不受信任壓縮輸入的儲存與執行限制。

C# 範例:選取 ZIP 封存中的 C++ 檔案

程式碼會開啟 ZIP 套件,依已核准的副檔名篩選非目錄項目,並將相符檔案寫入一個輸出目錄。將封存路徑扁平化可讓範例保持精簡,並防止上層目錄片段控制目的地。Production 程式碼也應為重複的輸出名稱定義確定性原則。

從 ZIP 擷取 C++ 檔案 - C#

using Aspose.Zip;
using System;
using System.IO;

string archivePath = Path.GetFullPath("package.zip");
string outputDirectory = Path.GetFullPath("extracted-cpp");
string[] allowedExtensions = { ".cpp" };
const ulong MaxEntrySize = 100UL * 1024 * 1024;

Directory.CreateDirectory(outputDirectory);

using (var archive = new Archive(archivePath))
{
    foreach (ArchiveEntry entry in archive.Entries)
    {
        if (entry.IsDirectory) continue;

        string fileName = Path.GetFileName(entry.Name);
        if (string.IsNullOrWhiteSpace(fileName)) continue;

        string extension = Path.GetExtension(fileName);
        if (!Array.Exists(
            allowedExtensions,
            value => string.Equals(value, extension, StringComparison.OrdinalIgnoreCase)))
        {
            continue;
        }

        if (entry.UncompressedSize > MaxEntrySize)
        {
            throw new InvalidDataException(
                $"項目 '{fileName}' 超過 100 MB 擷取限制。");
        }

        string destinationPath = Path.Combine(outputDirectory, fileName);
        entry.Extract(destinationPath);
    }
}

C++ 檔案的實作注意事項

相符的副檔名只會識別候選檔案;它不能證明內容可讀、有效或安全。在預覽、轉換或進一步處理之前,請使用理解 C++ 格式的元件驗證已擷取的檔案。

此範例會扁平化一般檔案的封存路徑。如果兩個已接受項目具有相同的最終名稱,ArchiveEntry.Extract 可能會覆寫現有輸出,因此請選擇明確的衝突原則:拒絕重複項目、產生唯一名稱,或保留已驗證的相對目錄樹。為每個作業使用個別目的地,避免並行要求混合結果。

安全性與隱私權考量

請將封存名稱和承載視為不受信任。切勿將 ArchiveEntry.Name 直接附加到目的地路徑,因為絕對路徑和上層目錄片段可能寫入預期資料夾之外。標準範例使用 Path.GetFileName;需要保留目錄的工作流程必須解析完整路徑,並確認其仍位於已核准根目錄之下。

為壓縮輸入大小、單一項目與總解壓縮大小、項目數量、處理時間和並行作業設定限制。擷取到受限制的暫存儲存區,失敗後清理部分輸出,在應用程式需要時掃描檔案,並避免記錄私人檔名或文件內容。

C++ 擷取常見問題

如何在 C# 中只從 ZIP 封存擷取 C++ 檔案?

使用 Archive 開啟 ZIP,列舉 Archive.Entries,符合 .cpp 副檔名,並對每個已接受的目的地路徑呼叫 Extract。

Aspose.ZIP 會驗證已擷取 C++ 檔案的內容嗎?

不會。副檔名只是第一道篩選。請使用理解 C++ 內容的元件驗證已還原的檔案。

相同的選取模式可以用於 7Z、RAR 或 TAR 容器嗎?

可以,但需使用對應的 Aspose.ZIP 封存類別開啟每種容器。不同封存格式的項目類型與可用擷取方法可能不同。

應如何處理重複的 C++ 檔名?

在擷取之前選擇規則:拒絕重複項目、產生唯一名稱,或保留已驗證的相對目錄結構。