首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 資料壓縮完全指南:GZipStream、SharpZipLib(BZip2)與檔案/字串/位元組陣列實作

     編輯:關於C#

.NET 內建 System.IO.Compression.GZipStream 提供無損壓縮,符合 RFC 1952 標準,相容 .gz 工具解壓。若需更高壓縮率或支援 Zip/Tar/BZip2,開源庫 ICSharpCode.SharpZipLib 是首選。本文涵蓋三種資料型態(位元組陣列、字串、檔案/目錄)的壓縮/解壓完整實作。

一、GZipStream(內建、零依賴)

1. 位元組陣列壓縮/解壓


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();
}

2. 字串壓縮/解壓(Base64 安全傳輸)


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);
}

3. 檔案/目錄壓縮(產生 .gz)


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);

二、SharpZipLib:BZip2 字串壓縮範例

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),否則解壓亂碼。
  • 已壓縮資料(如 .jpg、.zip)再壓縮可能**變大**,建議先檢查副檔名或魔數跳過。
  • 大檔案請用 FileStream 串流處理,避免一次載入記憶體導致 OOM。

掌握 GZipStream 與 SharpZipLib,涵蓋 95% 的 .NET 壓縮需求。下一篇將探討斷點續傳與多執行緒下載實作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved