小喵最近遇到一個狀況,小喵需要使用者上傳一個檔案,上傳後再由小喵的系統接手處理該檔案,但是如果上傳的檔案太大,會造成兩個影響:1.佔用頻寬。2.使用者上傳時間過久。
為了解決這樣的問題,於是小喵希望使用者上傳前,透過OS內建的Zipped壓縮機制將檔案壓縮成zip檔,然後上傳後再由小喵的系統接手解壓縮,之後再來處理檔案。
那麼就會遇到一個狀況:.NET Framework裡面雖然有System.IO.Compression這個命名空間,但是他的格式是Gzip而非ZIP,因此一般透過工具或者使用OS內建的Zipped產生的檔案無法透過這個命名空間提供的方式來解壓縮。小喵再次從網路上搜尋,發現有人透過J#的命名空間System.Java.Zip來處理。但是很不幸的是從.NET Framework 2.0開始不再支援J#這個語言。因此這樣的方式也不行。U_U
因此小喵開始尋找第三方的解決方案,找到了一個SharpZipLib這個免費的元件有提供可以壓縮與解壓縮zip格式。不過該元件的官方網站請參考【http://www.icsharpcode.net/OpenSource/SharpZipLib/】。該網站也提供範例檔案、原始碼提供使用者參考與研究。小喵試用之後發現,他裡面有提供一個FastZip的類別,裡面可以快速的直行兩個動作,分別是:
- 壓縮某資料夾(含子目錄)成為一個zip檔
- 解壓縮一個zip檔到指定的目錄
但是如果想要【壓縮某單一檔案成為zip檔】,在這個FastZip類別中並沒有提供,如果要做到這個需求,必須在撰寫一些額外的程式碼來達到。這對於使用上感覺不是很直觀
於是小喵自己在撰寫一個類別將SharpZip包裝起來,只提供三個簡單的Function,提供以下的功能:
- ZipDir(SourceDir,TargetFile):壓縮資料夾
- ZipFile(SourceFile,TargetFile):壓縮單一檔案
- UnZipFile(SourceFile,TargetDir):解壓縮到指定資料夾
這樣小喵就能夠用較為直觀的方式來壓縮、解壓縮。相關的原始碼如下:
2008版:http://vip2.blueshop.com.tw/topcat/sharefile/MySharpZip2008.zip
2005版:http://vip2.blueshop.com.tw/topcat/sharefile/MySharpZip2005.zip
2008/2/14補充:
有網友提到小喵的程式在壓縮資料夾的時候,沒有辦法將子資料夾中的檔案壓縮,小喵檢查了一下,原來是小喵一個參數下錯了,後來小喵有改正過來,但是上傳的檔案卻是修正前的,造成網友的不便真是抱歉
^_^a
要修改的Function內容如下:
使用方式:
先將該專案的bin中的DeBug中的兩個dll【ICSharpCode.SharpZipLib.dll】,【MySharpZip】加入參考。
然後就可以
以上方式與原始碼提供大家參考
^_^