在 .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++ 檔名?
在擷取之前選擇規則:拒絕重複項目、產生唯一名稱,或保留已驗證的相對目錄結構。
相關檔案擷取指南
瀏覽常見於 ZIP 套件中的檔案和資產的 C# 擷取頁面。