本博客所有文章分類的總目錄:【總目錄】本博客博文總目錄-實時更新
本博客其他.NET開源項目文章目錄:【目錄】本博客其他.NET開源項目文章目錄
1.前言
作為吉日嘎拉權限管理系統最早的一批學習版用戶,學了不少東西,在群里面也結識了很多朋友,更重要的是閑余時間,大家都發布很多可靠的外包工作。這次也是由於吉日嘎拉發布了一個有關“壓縮文件損壞檢測”的外包任務,最早在2009年用C#很簡單的使用過壓縮組件,這次有了這個需求,才所以才深入研究一番,順便有了這篇博客。
在日常項目開發過程中,操作Zip或者RAR壓縮文件也是一件比較常見的事情。主要是打包文件,解壓文件等等常規的操作,也相信很多人也用過.NET自帶的GZip壓縮。今天要給大家介紹的是一些開源的壓縮組件的一些簡單入門,由於壓縮格式很多,效率也不一樣,所以開源的東西還是很不錯的,支持很全面。
還是老規矩,本文將對這篇文章中提到的相關組件及其源代碼,文檔或者官方案例打包,統一於3月6日上午11點左右發送,需要的留下郵箱,過期不候。當然,好的文章和資源還需要園友們的支持,如果對你有幫助,不要吝嗇鼠標哦,你們的支持就是我原創的動力。
2.關於壓縮格式和算法的基礎
數據壓縮是按照特定的編碼機制用比未經編碼少的數據比特(或者其它信息相關的單位)表示信息的過程。隨着信息技術的高速發展,數據壓縮的使用在網絡時代越來越重要。對一些特殊的數據如相片、音頻、視頻的壓縮算法也不同。我們今天說的壓縮算法都是無損壓縮,無損數據壓縮指數據經過壓縮后,信息不受損失,還能完全恢復到壓縮前的原樣。“無損”一詞是相對於有損數據壓縮,有損數據壓縮只允許一個近似原始數據進行重建,以換取更好的壓縮率。常見的無損壓縮算法有LZW、ZIP、RAR、7-Zip等。詳細看看幾種主流的無損數據壓縮格式:
ZIP文件格式是一種流行的數據壓縮和文檔儲存的文件格式,原名Deflate。目前,ZIP格式屬於幾種主流的壓縮格式之一,其競爭者包括RAR格式以及開放源碼的7z格式。從性能上比較,RAR及7-Zip格式較ZIP格式壓縮率較高,而7-Zip由於提供了免費的壓縮工具而逐漸在更多的領域得到應用。該格式開放而且免費,越來越多的軟件內嵌支持打開Zip文件。
RAR是一種專利文件格式,用於數據壓縮與歸檔打包,RAR編碼器一直是有專利的。所以這也就是為什么我們看到很多開源的壓縮軟件或者工具能夠解壓RAR,而不支持RAR打包的原因。RAR通常情況比ZIP壓縮比高,但壓縮/解壓縮速度較慢。
7z是一種可以使用多種壓縮算法進行數據壓縮的檔案格式。該格式最初被7-Zip實現並采用,但是這種檔案格式是公有的,並且7-Zip軟件本身亦在GNU寬通用公共許可證 (GNU LGPL)協議下開放源代碼。7z格式的主要特色有:開源且模塊化的組件結構(允許使用任何壓縮,轉換或加密算法);高壓縮比率(使用不同的壓縮算法會有不同的結果);支持超大文件;該格式的開發結構允許添加標准以外的壓縮算法。
總結:總的來說,我還是比較喜歡7Zip格式,壓縮率確實高很多,而且開源。但是如果實際項目由於歷史原因等,需要采用Zip或者RAR的,也沒辦法,還是有很多開源的組件可供選擇。
3.幾種常見的.NET開源數據壓縮組件
3.1 ZIP-DotNetZip
DotNetZip是.NET開源壓縮組件中比較早的一個,我在2009年的時候給導師折騰一個小項目,就用到了,所以對其基本操作很熟悉。現在最新版本是1.9.1.8,很久沒更新了,也很穩定。網址:http://dotnetzip.codeplex.com/ 。使用DotNetZip,可以很容易的創建、解壓以及更新ZIP文件。官網有很多例子,以及介紹,篇幅比較長,就不去翻譯了。簡單使用,看下一節的使用例子就行了。
3.2 7Zip-SevenZipSharp
SevenZipSharp是.NET下開源的7-Zip格式操作組件,支持所有的7Zip格式。目前最新版本是2010年發布的0.64。由於7Zip的高壓縮率以及開源特點,在新項目中使用是最好的選擇。網址:http://sevenzipsharp.codeplex.com/ 。它支持的格式比上面多,如:7Zip,RAR,ZIP,Gzip,Cab,LZH等等。注意,除了引用這個組件之外,還需要加7z.dll文件拷貝到bin目錄中,因為SevenZipSharp是對7z.dll的一個封裝。7z.dll可以在官網http://7-zip.org/下載到,或者看我最后的資料下載,會打包進去的。
3.3 綜合-SharpCompress
SharpCompress 也是.NET下開源的壓縮文件操作組件。與上面2個不同的是,他支持的格式更多,如RAR,ZIP,Tar,7Zip等等。這個開源項目好像是去年才開始的,在其他幾個開源的項目基礎上發展而來,也包括了DotNetZip,Nunrar項目。當然對RAR也只是解壓,上面提到了RAR是專利算法,所以不支持創建RAR文件。當然這個還支持很多其他的壓縮格式,比如Tar、GZip等等,就不多說了,例子就用我們最常見的ZIP、RAR和7Zip。
3.4 關於調用WINRAR
在處理壓縮文件時,還有一種常見的方法,就是使用WINRAR的命令行。網上有很多操作的例子,我也測試過,成功了。但不得不說,靈活性很差。肯定可以滿足一小部分人的需求,但我認為這個方法的確不太好。所以在這里就不提倡了,畢竟有現成的更好的東西。為什么說這個WINRAR呢?主要是大家都知道WINRAR是收費的,RAR是專利算法,但其實WINRAR還是提供了免費的程序調用方式,就是UNRAR,在WINRAR的安裝文件夾有一個UnrarSrc.txt的說明文件,打開它,里面有地址:www.rarlab.com。需要的自己去看,我找這個東西可花了不少時間,就是因為資料太少,所以也留個腳印吧。
4.基本入門使用教程
4.1 DotNetZip的基本使用
1 //創建壓縮文件 2 using (ZipFile zip = new ZipFile()) 3 { 4 //設置密碼,也可以為每個文件單獨設置密碼 5 zip.Password= "123456!"; 6 //添加文件 7 zip.AddFile("ReadMe.txt"); 8 //添加目錄 9 zip.AddDirectory(@"MyDocuments\ProjectX"); 10 //設置備注信息 11 zip.Comment = "This is a demo"; 12 //還可以設置壓縮方式,編碼等 13 //保存文件 14 zip.Save("Package.zip"); 15 } 16 17 //解壓文件 18 using (ZipFile zip = ZipFile.Read("Demo.zip")) 19 { //遍歷zip文件中每一個文件對象,然后解壓到指定目錄 20 foreach (ZipEntry e in zip) 21 { 22 e.Extract(@"C:\test", true); 23 //若有密碼,用下面這個方法 24 e.ExtractWithPassword(BaseDirectory, Password); 25 } 26 //也可以通過索引訪問文件對象 27 //ZipEntry e = zip["MyReport.doc"]; 28 }
當然這只是最簡單的壓縮和解壓Zip文件的操作,還有更多功能可以操作Zip,比如移除文件,通過文件流來壓縮和解壓縮等等。可以看一下幫助文檔,這里只是介紹最基本的功能。因為這次研究這個主要是為了檢測錯誤的Zip文件,所以在這里,留一個疑問給大家:如何判斷一個zip文件是否損壞?過一段時間會給大家一個思路,當然不是唯一的解決辦法。
4.2 SevenZipSharp基本使用
這里只演示基本的使用,類庫還有異常處理、文件流操作等。可以看幫助文檔。
1 //初始化一個壓縮器,這個對象一次可以壓縮多個文件 2 SevenZipCompressor sc = new SevenZipCompressor(); 3 //設置壓縮格式,這里是枚舉類型,可以選其他的 4 sc.ArchiveFormat = OutArchiveFormat.Zip; 5 //壓縮模式,新創建還是追加,若是追加 6 sc.CompressionMode = CompressionMode.Create; 7 //設置壓縮算法,也可以不設置,采用默認的 8 //可以使用ZipEncryptionMethod來設置每個文件的密碼 9 sc.CompressionMethod = SevenZip.CompressionMethod.Default; 10 //單獨壓縮文件,CompressFilesEncrypted方法可以設置密碼 11 //注意這里的文件路徑,要寫全稱 12 sc.CompressFiles("test.zip", @"C:\X\a.txt", @"C:\X\b.txt"); 13 //CompressDirectory 方法單獨壓縮目錄 14 //CompressFileDictionary方法可以壓縮文件或者目錄,傳入一個字典,會自動識別目錄或者文件 15 16 //解壓縮,可以在初始化的時候設置解壓密碼 17 SevenZipExtractor se = new SevenZipExtractor("test.zip"); 18 foreach (var item in se.ArchiveFileNames) 19 { //逐一解縮 20 se.BeginExtractFiles(@"C:\X", item); 21 } 22 //一次性全部解壓 23 // se.BeginExtractArchive(@"C:\X");
4.3 SharpCompress基本使用
SharpCompress是在DotNetZip等開源項目的基礎上發展起來的,因此其使用和DotNetZip很類似。這里給一個網址,上面有例子,大家自己去琢磨一下:例子鏈接
4.總結與資源
總結起來,我覺得DotNetZip使用最靈活,而SevenZipSharp與SharpCompress支持的格式多,而且7zip的壓縮率很大,格式開源,使用的場合比較多。RAR格式盡量不要用吧,商業算法,非要使用,一般的類庫都可以解壓,但壓縮可以用上面3.4節提到的UNRAR。可能也還有很多其他的開源組件,不足之處,還請大家指出。
下面是上面幾個開源類庫的網址以及相關使用資源:
DotNetZip :http://dotnetzip.codeplex.com/
SevenZipSharp :http://sevenzipsharp.codeplex.com/
SharpCompress:http://sharpcompress.codeplex.com/