.NET 內建 System.IO.Compression.GZipStream 提供無損壓縮,符合 RFC 1952 標準,相容 .gz 工具解壓。若需更高壓縮率或支援 Zip/Tar/BZip2,開源庫 ICSharpCode.SharpZipLib 是首選。本文涵蓋三種資料型態(位元組陣列、字串、檔案/目錄)的壓縮/解壓完整實作。
public static byte[] Compress(byte[] input) {
using var outMs = new MemoryStream();
using (var gzip = new GZipStream(outMs, CompressionMode.Compress, true)) {
gzip.Write(input, 0, input.Length);
} // 必須先 Dispose/Close gzip,資料才會寫入 outMs
return outMs.ToArray();
}
public static byte[] Decompress(byte[] input) {
using var inMs = new MemoryStream(input);
using var outMs = new MemoryStream();
using (var gzip = new GZipStream(inMs, CompressionMode.Decompress)) {
gzip.CopyTo(outMs);
}
return outMs.ToArray();
}
public static string Compress(string input) {
byte[] bytes = Encoding.Default.GetBytes(input); // 或 UTF8
byte[] compressed = Compress(bytes);
return Convert.ToBase64String(compressed);
}
public static string Decompress(string input) {
byte[] bytes = Convert.FromBase64String(input);
byte[] decompressed = Decompress(bytes);
return Encoding.Default.GetString(decompressed);
}
public static void Compress(FileInfo file) {
using var original = file.OpenRead();
if ((file.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden
&& file.Extension != ".gz") {
using var compressed = File.Create(file.FullName + ".gz");
using var gzip = new GZipStream(compressed, CompressionMode.Compress);
original.CopyTo(gzip);
}
}
public static void Decompress(FileInfo file) {
using var original = file.OpenRead();
string target = file.FullName.Substring(0, file.FullName.Length - file.Extension.Length);
using var decompressed = File.Create(target);
using var gzip = new GZipStream(original, CompressionMode.Decompress);
gzip.CopyTo(decompressed);
}
public static void Compress(DirectoryInfo dir)
=> dir.GetFiles().ToList().ForEach(Compress);
public static void Decompress(DirectoryInfo dir)
=> dir.GetFiles().ToList().ForEach(Decompress);
NuGet:Install-Package SharpZipLib
using ICSharpCode.SharpZipLib.BZip2;
public static string Compress(string input) {
byte[] buffer = Encoding.UTF8.GetBytes(input);
using var outMs = new MemoryStream();
using (var bzip = new BZip2OutputStream(outMs)) {
bzip.Write(buffer, 0, buffer.Length);
}
return Convert.ToBase64String(outMs.ToArray());
}
public static string Decompress(string input) {
byte[] buffer = Convert.FromBase64String(input);
using var inMs = new MemoryStream(buffer);
using var bzip = new BZip2InputStream(inMs);
using var reader = new StreamReader(bzip, Encoding.UTF8);
return reader.ReadToEnd();
}
SharpZipLib 另支援 ZipOutputStream、TarOutputStream、GZipOutputStream 等,API 風格一致。
| 演算法 | 壓縮率 | 速度 | 適用場景 |
|---|---|---|---|
| GZip (Deflate) | 中 | 快 | 通用、.gz 相容、內建零依賴 |
| BZip2 | 高 | 慢 | 文字資料、日誌壓縮、傳輸頻寬敏感 |
| LZ4 / Zstd | 中高 | 極快 | 即時通訊、高吞吐、需引用第三方庫 |
CompressSample.zip 含完整專案與測試案例。
GZipStream **必須先 Dispose/Close** 再讀取 MemoryStream.ToArray(),否則資料不完整。Encoding.Default 或指定 UTF8),否則解壓亂碼。FileStream 串流處理,避免一次載入記憶體導致 OOM。掌握 GZipStream 與 SharpZipLib,涵蓋 95% 的 .NET 壓縮需求。下一篇將探討斷點續傳與多執行緒下載實作。