.net 的压缩类库 (引用)

    技术2022-05-20  28

    在專案中或多或少都有機會遇到需要處理壓縮檔的情況,而一般最常見的壓縮格式就是 ZIP 格式,雖然有人愛用 RAR 格式,但因為若要建立 RAR 壓縮檔時,只能用 WinRAR 軟體,而這是個需付費的商業軟體,所以我本身很不愛用,大多僅使用 ZIP 或 7-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 中,說也奇怪,這麼常用的功能盡然潛藏在一個這麼少人用的地方,若有興趣瞭解的人可以參考以下文章:

    Using the Zip Classes in the J# Class Libraries to Compress Files and Data with C# Simple application to Zip and UnZip files in C# using J# libraries

    相關連結

    SharpZipLib - .NET Zip Library SharpZipLib - Frequently Asked Questions DotNetZip Library @ MSDN Code Gallery DotNetZip Library @ CodePlex DotNetZip Library – C# Examples Using the Zip Classes in the J# Class Libraries to Compress Files and Data with C# Simple application to Zip and UnZip files in C# using J# libraries Visual J# Class Library ZIP (文件格式) - 維基百科 DEFLATE - 維基百科,自由的百科全書

    最新回复(0)