在.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原生不提供進度反饋機制,但你可以透過計算處理的檔大小來估算進度。