The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

介紹幾款好用的壓縮函示庫:SharpZipLib 與 DotNetZip

在專案中或多或少都有機會遇到需要處理壓縮檔的情況,而一般最常見的壓縮格式就是 ZIP 格式,雖然有人愛用 RAR 格式,但因為若要建立 RAR 壓縮檔時,只能用 WinRAR 軟體,而這是個需付費的商業軟體,所以我本身很不愛用,大多僅使用 ZIP7-Zip 等較為開放的壓縮格式。

今天我就來介紹兩款我曾經用過的壓縮函示庫:

1. SharpZipLib - .NET Zip Library

SharpZipLib 是完全用 C# 撰寫並附有完整原始碼可供下載,此元件也已經問世一段時間了,我幾年前就用過了,支援多種壓縮格式,包括 Zip, GZip, BZip2 and Tar 等。

至於使��此元件的方式是採用 Stream 的方式開發,跟 .NET BCL 內建的 GZipStream 用法差不多,差別在於 ZIP 格式可以壓縮「多個檔案」而已,若已經有使用過 GZipStream 的人要上手也不是什麼難事。

以下是我從下載的範例程式中擷取的程式碼片段,這段是用來建立一個 Zip 檔的範例:

string[] filenames = Directory.GetFiles(args[0]);
using (ZipOutputStream s = new ZipOutputStream(File.Create(args[1])))
{
    s.SetLevel(9); // 0 - store only to 9 - means best compression
    byte[] buffer = new byte[4096];
    foreach (string file in filenames)
    {
        ZipEntry entry = new ZipEntry(Path.GetFileName(file));
        entry.DateTime = DateTime.Now;
        s.PutNextEntry(entry);        
        using ( FileStream fs = File.OpenRead(file) ) {
            int sourceBytes;
            do {
                sourceBytes = fs.Read(buffer, 0, buffer.Length);
                s.Write(buffer, 0, sourceBytes);
            } while ( sourceBytes > 0 );
        }
    }    
    s.Finish();
    s.Close();
}

2. DotNetZip - anage ZIP files from within .NET applications

如果你單純的只想使用 Zip 壓縮、解壓縮的話,我個人是建議使用 DotNetZip 即可,光看範例程式就知道他的精簡與直覺的使用方法:

壓縮檔案

using (ZipFile zip = new ZipFile("Archive.zip"))
{
    zip.AddFile("ReadMe.txt");
    zip.AddFile("7440-N49th.png");
    zip.AddFile("2005_Annual_Report.pdf");        
    zip.Save();
}

壓縮檔案 ( 含密碼保護 )

using (ZipFile zip = new ZipFile("Backup.zip"))
{
  zip.Password= "123456!";
  zip.AddFile("ReadMe.txt");
  zip.AddFile("7440-N49th.png");
  zip.AddFile("2005_Annual_Report.pdf");        
  zip.Save();
}

壓縮檔案 ( 可根據不同檔案設定不同的解壓縮密碼 )

using (ZipFile zip = new ZipFile("Backup.zip"))
{
  zip.AddFile("ReadMe.txt"); // no password for this entry

  zip.Password= "123456!";
  ZipEntry e = zip.AddFile("7440-N49th.png");
  e.Comment = "Map of the company headquarters."; 

  zip.Password= "!Secret1";
  zip.AddFile("2Q2008_Operations_Report.pdf");
  
  zip.Save();
}

壓縮整個目錄 ( 還可對壓縮的項目設定註解 )

using (ZipFile zip = new ZipFile(ZipFileToCreate))
{
  zip.AddDirectory(@"MyDocuments\ProjectX");
  zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G") ; 
  zip.Save();
}

在 ASP.NET 頁面中實做下載壓縮檔功能 ( 直接將壓縮檔輸出到 Response.OutputStream 喔 )

public void btnGo_Click (Object sender, EventArgs e)
{
  Response.Clear();
  String ReadmeText= "This is a zip file dynamically generated at " 
    + System.DateTime.Now.ToString("G");
  string filename = System.IO.Path.GetFileName(ListOfFiles.SelectedItem.Text) + ".zip";
  Response.ContentType = "application/zip";
  Response.AddHeader("content-disposition", "filename=" + filename);
  
  using (ZipFile zip = new ZipFile(Response.OutputStream)) {
    zip.AddFile(ListOfFiles.SelectedItem.Text, "files");
    zip.AddFileFromString("Readme.txt", "", ReadmeText);
    zip.Save();
  }
 
  Response.End();
}

還有一堆範例程式可以在這裡看到。不過光看到以上的範例就知道好用了吧! ^_^

---

最後,還有一個鮮為人知的壓縮、解壓縮的類別庫潛藏在 Visual J# Class Library 中,說也奇怪,這麼常用的功能盡然潛藏在一個這麼少人用的地方,若有興趣瞭解的人可以參考以下文章:

相關連結