當前位置: 妍妍網 > 碼農

.NET環境下使用原生方法實作檔壓縮與解壓

2024-07-08碼農

在.NET環境下,處理檔壓縮與解壓是一個常見的需求,特別是在需要最佳化儲存空間或網路傳輸效率時。幸運的是,.NET Framework和.NET Core提供了原生支持,使我們可以輕松地實作檔壓縮與解壓功能。本文將深入探討如何在.NET環境下使用原生方法來完成這些任務,並提供具體的例子程式碼。

一、引言

檔壓縮與解壓是數據處理的常見需求,特別是在處理大量數據或需要最佳化網路傳輸時。在.NET中,我們可以利用 System.IO.Compression 名稱空間中的類來實作這一功能。這個名稱空間提供了 ZipFile ZipArchive 等類,用於處理ZIP檔的壓縮與解壓。

二、壓縮檔

在.NET中,我們可以使用 ZipFile 類的 CreateFromDirectory 方法來壓縮整個資料夾。以下是一個簡單的例子:

using System.IO.Compression;
string startPath = @"c:\example\start"// 要壓縮的資料夾路徑
string zipPath = @"c:\example\result.zip"// 壓縮後的ZIP檔路徑
ZipFile.CreateFromDirectory(startPath, zipPath);

這段程式碼會將 startPath 指定的資料夾壓縮成一個名為 result.zip 的ZIP檔。

如果你只想壓縮特定的檔,而不是整個資料夾,你可以使用 FileStream ZipArchive 來實作:

using System.IO;
using System.IO.Compression;
string startPath = @"c:\example\file.txt"// 要壓縮的檔路徑
string zipPath = @"c:\example\result.zip"// 壓縮後的ZIP檔路徑
using (FileStream zipToOpen = new FileStream(zipPath, FileMode.Create))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
{
ZipArchiveEntry readmeEntry = archive.CreateEntry("file.txt");
using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
{
using (StreamReader reader = new StreamReader(startPath))
{
string content = reader.ReadToEnd();
writer.Write(content);
}
}
}
}

這段程式碼會建立一個名為 result.zip 的ZIP檔,並將 file.txt 檔壓縮排去。

三、解壓檔

解壓檔同樣簡單。我們可以使用 ZipFile 類的 ExtractToDirectory 方法來解壓ZIP檔到指定資料夾:

using System.IO.Compression;
string zipPath = @"c:\example\start.zip"// 要解壓的ZIP檔路徑
string extractPath = @"c:\example\extract"// 解壓後的資料夾路徑
ZipFile.ExtractToDirectory(zipPath, extractPath);

這段程式碼會將 start.zip 檔解壓到 extract 資料夾中。

如果你需要更細粒度的控制,比如只解壓ZIP檔中的特定檔,你可以使用 ZipArchive 來實作:

using System.IO;
using System.IO.Compression;
string zipPath = @"c:\example\start.zip"// 要解壓的ZIP檔路徑
string extractPath = @"c:\example\extract"// 解壓後的資料夾路徑
string fileToExtract = "file.txt"// 要解壓的檔名
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
ZipArchiveEntry entry = archive.GetEntry(fileToExtract);
if (entry != null)
{
string fullPath = Path.Combine(extractPath, entry.FullName);
entry.ExtractToFile(fullPath, overwrite: true);
}
}

這段程式碼會從 start.zip 檔中解壓出 file.txt 檔到 extract 資料夾中。

四、高級用法

1. 壓縮級別

在壓縮檔時,你可以指定壓縮級別來最佳化壓縮效果。 ZipArchiveMode.Create 方法接受一個 CompressionLevel 列舉參數,允許你選擇不同的壓縮級別:

using (FileStream zipToOpen = new FileStream(zipPath, FileMode.Create))
{
using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create, true))
{
// ... 添加檔到ZIP歸檔中
}
}

在這個例子中,第三個參數是布爾值,表示是否壓縮歸檔中的條目。你也可以透過 ZipArchiveEntry.CompressionLevel 內容為單個條目設定壓縮級別。

2. 密碼保護

.NET的 System.IO.Compression 名稱空間不支持為ZIP檔添加密碼保護。如果你需要這個功能,你可能需要使用第三方庫,如 DotNetZip

3. 進度反饋

在壓縮或解壓大檔時,提供進度反饋是一個很好的使用者體驗。然而, System.IO.Compression 名稱空間並沒有直接提供進度反饋的機制。你可以透過計算處理的檔大小與總大小來估算進度,並使用例如 IProgress<T> 介面來報告進度。

五、總結

在.NET環境下,使用原生方法實作檔壓縮與解壓是相對簡單的。 System.IO.Compression 名稱空間提供了必要的類和方法來處理ZIP檔的壓縮與解壓。你可以輕松地壓縮整個資料夾或單個檔,並將它們解壓到指定位置。此外,你還可以控制壓縮級別,盡管.NET原生不支持密碼保護,但你可以使用第三方庫來實作這一功能。最後,雖然.NET原生不提供進度反饋機制,但你可以透過計算處理的檔大小來估算進度。