.NET開源項目的前世和今生系列 之 .NET開源壓縮文檔處理的前世和今生
2009-12-25 14:56 靈感之源 閱讀(6634) 評論(32) 收藏 舉報序
這是《.NET開源項目的前世和今生系列》之一,如上一篇《.NET開源數據庫的前世和今生》。這些系列是我對過去10年中了解的.NET開源項目的總結。
《.NET開源項目的前世和今生系列》的大概結構如下(假如我還有心思寫下去的話):
- 《.NET開源數據庫的前世和今生》 上、下
- 《.NET開源文檔處理的前世和今生》:壓縮、Office(Word/Excel/PPT/MAPI)、其它(PDF/RTF)
- 《.NET開源多媒體處理的前世和今生》:圖像、圖標、視頻、音頻、Flash等
- 《.NET開源基礎庫的前世和今生》:Queue、Schedule
- 《.NET開源網絡訪問的前世和今生》:Web服務器、爬蟲、MSN、XMPP、IRC、NNTP、統計
- 《.NET開源系統交互與安全的前世和今生》:環境/進程/安全/認證
前言
開發行業很多開源的項目,歷史我不在這里追溯,既然那么多有心有力的朋友分享了他們的成果,在遵循許可的情況下,我們拿來用就是了。當然,你可以寫比開源的更好更適合自己的,但擺著現成的不用那可是罪過啊。不過選擇開源項目需要考慮很多:1.項目的協議,會不會造成代碼污染;2.項目的生命力,說不定明天作者就不干了,又或者作者過著逍遙自在的生活,幾年都不更新一次,你自己接著開發?
正題
Zip
好吧,相信大部分人都知道.NET Zip Library #ziplib (SharpZipLib),這是SharpDevelop的之父Mike Krueger在寫SharpDevelop的副產物。目的很單純:就是想弄個純c#的讀寫zip的,不想用InterOp。我之前說過,做開源項目的,多是重口味的。SharpZipLib使用非常廣泛,幾乎每個需要用到壓縮文檔的.NET程序都會選擇它。它很優秀,確實,雖然在初期對中文支持不好。雖然它的“雙性”許可比較讓人糊涂。但有好事者反復在論壇上問SharpZipLib的許可,作者也坐不住了,在了那套首頁特別說明了,LGPL,商業免費。早說嘛,程序員都喜歡瞎折騰。
既然SharpZipLib那么優秀,那為什么別人還寫類似的呢?因為除了重口味,還有輕口味的需求:部分程序還是輕量級的,譬如我。一般需求就是:壓縮、解壓Zip文檔,或者只是壓縮、解壓一個byte數組。在.NET 2.0之前的1.X時代,我們只能用:Interop + Zlib:#zlib - Modifying Archives。但有一些潔癖的,覺得額外用一個Win32的dll很不爽。所以便有了純C#的ZLIB.NET。如果你只是想壓縮byte數組:Better Than Zip Algorithm For Compressing In-Memory Data。在.NET 2.0,引入了System.IO.Compression.DeflateStream和System.IO.Compression.GZipStream。
如果你想壓縮文檔:ZipStorer - A Pure C# Class to Store Files in Zip,它還在這里弄了個項目:ZipStorer - A Pure C# Class to Store Files in Zip ,但有一個很要命的問題:它不支持壓縮。當然還有支持壓縮的:Encrypted Zipping of Files in C# and Java。
在.NET 3.x,微軟的腦筋終于通了,引入了文檔壓縮:.NET Framework Zip / UnZip Tool Using the Packaging Namespace
重口味的,還有用J#自帶的來弄的,如:Zip/Unzip using java.util.zip .net namespace and more、Zip and Unzip from a C# program using J# runtime 、Simple Application to Zip and UnZip files in C# using J#,也有用Windows系統的:Compress Zip files with Windows Shell API and C#
如果你純粹要求一個足夠強大的Zip文檔壓縮讀寫庫,我建議你用DotNetZip Library 。它具備了ZIP的所有操作,也很彈性,誰用誰知道~
除了基本的文檔壓縮之外,還衍生出了開發項目的自動壓縮,如:ZipStudio - A versatile Visual Studio add-in to zip up Visual Studio solutions and projects(項目:ZipStudio ) 、SolutionZipper: VS 2005 Add-in Cleans and Zips a Solution in One Step、Zip Solution 、SolZip、Backup Project Files to Gmail ,當然還有Extracting files from a remote ZIP archive這種特別的需求。當然,還有更特殊的癖好:.NET wrapper for Info-ZIP。
Cab
7Zip支持Cab,但我們或許不需要那么大的東西,我們只需要:Cabinet File (*.CAB) Compression and Extraction。很不幸,這也是Interop,而且還是用vc++ .net封裝的。但我們也有Jim Mischel直接C#封裝的:Accessing CAB Files from .NET 。
7Zip
SharpZipLib不支持RAR、ISO、7z、Arj、Cab、Rpm、Wim、Udf、Xar、Dmg等等,等等。天啊,原來SharpZipLib這么差的。。。如果你了解7Zip,其實這些就是7Zip所支持的格式。7Zip是用C寫的,為Win32系統提供了COM接口。所以我們也只能用Interop了(我討厭Interop!)。第一個吃螃蟹的是Eugene Sichkar,他寫完 C# (.NET) Interface for 7-Zip Archive DLLs(項目:7zSharp ),繼承了光榮的開源傳統,不更新了。不過有另外一個牛人接過了他的衣缽:SevenZipSharp。當然,你還可以用純C#讀取7z格式:Port of 7zip archive reader to C#
RAR
你可以用RAR官方的SDK(UnRAR.dll)中包含的C#例子來讀取,也可以用7Zip來讀取RAR,但如果你需要純C#的,這里有一個新鮮出爐的:NUnrar,第一版是不支持中文,而且文件名讀取邏輯錯誤。我提出了之后,作者很快就修正了,可見部分外國的開源作者還是很閑的。。。除了讀取,除非給你錢RAR的作者,否則你不能生成RAR文件,專利,有些時候讓你很不爽;)
你想生成RAR又不想給錢?那可以:
StringBuilder command = new StringBuilder(" a -ep \"" + RARFile + "\" ");
for (int i = 0; i < Files.Count; i++)
{
command.Append("\"" + Files[i] + "\" ");
}
ProcessStartInfo info = new ProcessStartInfo(winRAR, command.ToString());
Process process = new Process();
process.StartInfo = info;
process.Start();
process.WaitForExit();
當然,你還得先判斷一下winrar.exe是否存在。
Tar
SharpZipLib可以對Tar進行讀寫,另外,你還可以選擇:tar-cs
ISO、VHD、VDI、 XVA、VMDK
SharpZipLib可以對ISO進行讀寫,你還可以用C# ISO image creator 來創建ISO,GomuIso9660 來讀寫。另外,還有更專業的:.NET DiscUtils ,除了ISO,它可以讀寫VHD, VDI, XVA, VMDK等各種虛擬機的文件!
MTF
MTF,就是Microsoft Tape Format,你可以用Reading MTF Backup Files來讀取。
題外話
不要把壓縮文件想得太復雜了,不同的格式雖有差異,但大體都是:一個總的文件頭,記錄多少個文件,偏移,大小等,然后是多個文件頭(文件名、壓縮前后大小、校驗碼等),最后就是壓縮后的數據了。所以,主要差異還是文件頭和壓縮算法。
除了.zip,.cbz、.jar、.xap、Visual Studio的模板文件等等都是zip文件,只不過擴展名不一樣罷了。同樣,.cbr也是rar文件。
浙公網安備 33010602011771號