topcat姍舞之間的極度凝聚

分享...是知識累積的開始....(Microsoft ASP/ASP.NET MVP)


My Links

Blog Stats

News

搬家公告:
未來小喵的文章會以點部落為主。
http://www.dotblogs.com.tw/topcat/
小鋪也會同步貼過來。不過在排版上能會比較沒有兼顧到。歡迎舊雨新知多多支持。 有與小喵交換網址或者訂閱的人,也建議連到那邊去。



目前線上人數:

隨筆分類

每月文章

影像集

其他部落格

工具網站

技術論壇

線上教學

語言學習

小喵最近遇到一個狀況,小喵需要使用者上傳一個檔案,上傳後再由小喵的系統接手處理該檔案,但是如果上傳的檔案太大,會造成兩個影響: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的類別,裡面可以快速的直行兩個動作,分別是:

  1. 壓縮某資料夾(含子目錄)成為一個zip檔
  2. 解壓縮一個zip檔到指定的目錄

但是如果想要【壓縮某單一檔案成為zip檔】,在這個FastZip類別中並沒有提供,如果要做到這個需求,必須在撰寫一些額外的程式碼來達到。這對於使用上感覺不是很直觀

於是小喵自己在撰寫一個類別將SharpZip包裝起來,只提供三個簡單的Function,提供以下的功能:

  1. ZipDir(SourceDir,TargetFile):壓縮資料夾
  2. ZipFile(SourceFile,TargetFile):壓縮單一檔案
  3. 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】加入參考。
然後就可以

以上方式與原始碼提供大家參考
^_^

posted on Monday, February 04, 2008 3:56 PM

Feedback

# re: 使用自訂的類別透過SharpZip執行Zip壓縮、解壓縮(VB.NET) 2/15/2008 4:27 PM 小石頭

我下載 2005版 開啟後
會出現

"因為下列原因 無法載作方案中的一或多個專案
專案檔或WEB己經移動 重新命名或不在您電腦上
方案總管會將這些專案標示為無法使用 請展開專案節點
"

結果..不能執行

不知小喵知什麼原因嗎





# re: 使用自訂的類別透過SharpZip執行Zip壓縮、解壓縮(VB.NET) 2/16/2008 3:13 PM topcat

不好意思...
當初匆忙下
壓縮之前沒有把小喵測試的WinForm移除掉
殘留在Solution裡面

小喵順邊把給錯的參數補上
再次包裝了
請大家再下載一次試試看
^_^



# re: 使用自訂的類別透過SharpZip執行Zip壓縮、解壓縮(VB.NET) 2/16/2008 4:26 PM 小石頭

嗯..可以了

感謝小喵無私分享..




# Compression and Decompression of Files(C#) 4/10/2008 5:58 PM Simple is Life..

Compression and Decompression of Files(C#)


# Compression and Decompression of Files(C#) 4/10/2008 6:03 PM Simple is Life..

Compression and Decompression of Files(C#)


# re: 使用自訂的類別透過SharpZip執行Zip壓縮、解壓縮(VB.NET) 5/7/2008 8:35 PM show

想請問一下,可以用在ASP嗎?
因為我想寫一個上傳壓縮檔後,在伺服器上解壓縮的程式。


# re: 使用自訂的類別透過SharpZip執行Zip壓縮、解壓縮(VB.NET) 5/8/2008 7:37 PM David

請問要如何才能下載?
我點
http://vip.blueshop.com.tw/topcat/sharefile/MySharpZip2005.zip
後會連到
http://vip2.blueshop.com.tw/topcat/
就沒有了



# re: 使用自訂的類別透過SharpZip執行Zip壓縮、解壓縮(VB.NET) 5/9/2008 12:13 AM topcat

不好意思,由於小喵再小舖的帳號有些異動,所以網址有點改變,小喵已經修正了, 請在測試看看
^_^


# 注册ICSharpCode.SharpZipLib.dll到操作系统中让ASP可以透过COM 呼叫 6/8/2008 12:10 AM topcat




# re: 使用自訂的類別透過SharpZip執行Zip壓縮、解壓縮(VB.NET) 6/25/2008 1:18 AM 冰寒隱翼

首先先感謝大大分享這麼方便的東西!
幫助很大 真的很感謝

然後
想問一下 如果是針對已加密碼的 *.zip
有沒有什麼參數寫法可以讓它使用合法密碼來解壓縮?

比方在介面多設定一個 TextBox 輸入解壓縮密碼

或者針對有密碼的ZIP寫例外處理
跳出 InputBox

問看看而已XD


# re: 使用自訂的類別透過SharpZip執行Zip壓縮、解壓縮(VB.NET) 7/8/2008 1:02 PM kj

不好意思,我下載了您提供的兩個.dll 加入參考,並照著測試了一下:
Dim oZip As New MySharpZip.CZip
Dim result As String = oZip.UnZipFile(TxtOpen.Text, GetFilePath(TxtOpen.Text))
If result <> "Success" Then MsgBox("解壓縮失敗!") : Exit Sub

會有"Cannot find central directory"的Exception發生,不知是什麼環節錯誤呢?


Post Feedback

Title:
Name:
Url:
驗證碼  
Comments: