小喵自己在撰寫一個類別將SharpZip包裝起來,只提供三個簡單的Function,提供以下的功能:
ZipDir(SourceDir,TargetFile):壓縮資料夾
ZipFile(SourceFile,TargetFile):壓縮單一檔案
UnZipFile(SourceFile,TargetDir):解壓縮到指定資料夾
這樣小喵就能夠用較為直觀的方式來壓縮、解壓縮。
小喵最近遇到一個狀況,小喵需要使用者上傳一個檔案,上傳後再由小喵的系統接手處理該檔案,但是如果上傳的檔案太大,會造成兩個影響: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):解壓縮到指定資料夾
這樣小喵就能夠用較為直觀的方式來壓縮、解壓縮。相關的原始碼如下:
Imports System.IO
Imports ICSharpCode.SharpZipLib.Checksums
Imports ICSharpCode.SharpZipLib.Zip
Imports ICSharpCode.SharpZipLib.GZip
Imports System.IO.Compression
Public Class CZip
Public Function ZipDir(ByVal SourceDir As String, ByVal TargetFile As String) As String
'**********************************************************************************
' 壓縮整個目錄
' 傳入參數:
' SourceDir:要壓縮的資料夾(完整路徑)
' TargetFile:要產生的Zip檔案(完整路徑檔名)
'**********************************************************************************
Dim oZipDir As New ICSharpCode.SharpZipLib.Zip.FastZip
Try
'檢查目錄是否存在
If Not (My.Computer.FileSystem.DirectoryExists(SourceDir)) Then
Throw New Exception("資料夾不存在!!")
End If
oZipDir.CreateZip(TargetFile, SourceDir, True, "")
Return "Success"
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End Function
Public Function ZipFile(ByVal SourceFile As String, ByVal TargetFile As String) As String
'**********************************************************************************
' 壓縮單一檔案
'**********************************************************************************
'檢查要壓縮的檔案是否存在
Try
If Not My.Computer.FileSystem.FileExists(SourceFile) Then
Throw New Exception("要壓縮的檔案【" & SourceFile & "】不存在")
End If
Dim zs As ZipOutputStream = New ZipOutputStream(File.Create(TargetFile))
zs.SetLevel(9)
Dim fn As String = SourceFile
Dim oSF As New oFile(SourceFile)
Dim s As FileStream = File.OpenRead(fn)
Dim buffer As Byte() = New Byte(s.Length - 1) {}
s.Read(buffer, 0, buffer.Length)
'Dim Entry As New ZipEntry("nice.mdb")
Dim Entry As New ZipEntry(oSF.FileName & "." & oSF.Exten)
Entry.DateTime = DateTime.Now
Entry.Size = s.Length
s.Close()
zs.PutNextEntry(Entry)
zs.Write(buffer, 0, buffer.Length)
zs.Finish()
zs.Close()
Return "Success"
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End Function
Public Function UnZipFile(ByVal SourceFile As String, ByVal TargetDir As String) As String
'**********************************************************************************
' 解壓縮
' 傳入參數:
' SourceFile:要產生的Zip檔案(完整路徑檔名)
' TargetFile:解壓縮後存放的路徑(完整路徑)
'**********************************************************************************
Dim oZip As New ICSharpCode.SharpZipLib.Zip.FastZip
Try
'判斷ZIP檔案是否存在
If Not My.Computer.FileSystem.FileExists(SourceFile) Then
Throw New Exception("要解壓縮的檔案【" & SourceFile & "】不存在,無法執行")
End If
oZip.ExtractZip(SourceFile, TargetDir, "")
Return "Success"
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End Function
End Class
這裡面會用到oFile的類別,定義如下:
Public Class oFile
Private m_FileName As String
Private m_Path As String
Private m_Exten As String
Public Property FileName() As String
Get
Return m_FileName
End Get
Set(ByVal value As String)
m_FileName = value
End Set
End Property
Public Property Path() As String
Get
Return m_Path
End Get
Set(ByVal value As String)
m_Path = Path
End Set
End Property
Public Property Exten() As String
Get
Return m_Exten
End Get
Set(ByVal value As String)
m_Exten = value
End Set
End Property
Public ReadOnly Property FullFileName() As String
Get
Return m_Path & "\" & m_FileName & "." & m_Exten
End Get
End Property
Public Sub New()
End Sub
Public Sub New(ByVal thisFullFileName As String)
Dim tStr() As String = Split(thisFullFileName, "\")
Dim Fn As String = tStr(tStr.Length - 1)
Dim tStr2() As String = Split(Fn, ".")
m_Exten = tStr2(1)
m_FileName = Replace(Fn, "." & m_Exten, "")
m_Path = Replace(thisFullFileName, "\" & Fn, "")
End Sub
End Class
使用方式:
先將該專案的bin中的DeBug中的兩個dll【ICSharpCode.SharpZipLib.dll】,【MySharpZip】加入參考。
然後就可以
Dim oZip As New MySharpZip.CZip
Dim rc As String=oZip.UnZipFile("D:\Temp\abc.zip", "D:\Temp")
If rc = "Success" Then
Me.lblMsg.Text="解壓縮成功!!"
End If
以下是簽名:
- 歡迎轉貼本站的文章,不過請在貼文主旨上加上【轉貼】,並在文章中附上本篇的超連結與站名【topcat姍舞之間的極度凝聚】,感恩大家的配合。
- 小喵大部分的文章會以小喵熟悉的語言VB.NET撰寫,如果您需要C#的Code,也許您可以試著用線上的工具進行轉換,這裡提供幾個參考
Microsoft MVP Visual Studio and Development Technologies (2005~2019/6) | topcat Blog:http://www.dotblogs.com.tw/topcat |