這是我的文章備份   原文請看 ----  [習題] Ch17 File與 I/O -- 檔案壓縮,採用 GZipStream 類別

http://www.dotblogs.com.tw/mis2000lab/archive/2010/07/02/file_compression_decompression.aspx

 

 

===========================================

[習題] Ch17 File與 I/O -- 檔案壓縮,採用 GZipStream 類別

這兩個檔案(一個進行壓縮、另一個解壓縮),可以當成「ASP.NET專題實 務」一書,
第十七章 File與 I/O 的 補充習題。

 



今天有一位讀者詢問檔案壓縮的問題,
我查了一下 DotBlogs,高手如雲,文章很多。

有兩篇很優異的文章要跟大家推薦:

余小章 兄 -- http://www.dotblogs.com.tw/yc421206/archive/2009/01/18/6869.aspx
鄭子漣 兄 -- http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1886.entry

 

鄭子漣 兄發現一個問題,建議您參考他的文章,仔細閱讀一遍。
MSDN文件,為此補充說明如下:

DeflateStream  和 GZipStream  類別的最佳使用方式是用於未壓縮的資料來源。

如果來源資料已經壓縮,使用這些類別可能會增加資料流的實際大小

 

===========================================================================


微軟官方的MSDN,當然是最佳選擇。
有中文說明與範例:  http://msdn.microsoft.com/zh-tw/library/system.io.compression.gzipstream.aspx

壓縮、解壓縮都有提供範例,直接修改便能使用了!真棒!

透過 GZipStream 類別,會壓縮成 .gz檔案,可以透過常用的 WinZip等軟體,來解壓縮

MSDN文件,說明如下:

這個類別表示 GZIP 資料格式,它使用無失真檔案壓縮和解壓縮的工業標準演算法。該格式包含用於偵測資料毀損的循環冗餘檢查 (CRC) 值。GZIP 資料格式使用與 DeflateStream  類別相同的演算法,但它可擴充使用其他壓縮格式。該格式可以很容易地使用專利不涵蓋的方式實作。這個類別不能用於壓縮大於 4 GB 的檔案。

 

範例 File_Compression.aspx  (進行壓縮)

01 '=== 進行壓縮,必須宣告這兩個 NameSpace ===
02 '=== 進行壓縮,必須宣告這兩個 NameSpace ===
03 Imports System.IO
04 Imports System.IO.Compression

05 '=== 進行壓縮,必須宣告這兩個 NameSpace ===
06
07
08     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
09         '== 此範例會壓縮某一個目錄下,所有的檔案。
10         '== 請先設定一個檔案,底下存放一些 .txt檔
11
12         Dim dirpath As String = "c:\MIS2000Lab_ASP.NET_Log"
13         Dim dir As DirectoryInfo = New DirectoryInfo(dirpath)
14
15         '== 壓縮某一個目錄下,所有的檔案。(更下層的子目錄,本範例無法壓縮)
16         For Each fi As FileInfo In dir.GetFiles()
17             Compress(fi)
18         Next
19
20     End Sub

21
22
23     Private Sub Compress(ByVal fi As FileInfo)
24         ' Get the stream of the source file.
25         Using inFile As FileStream = fi.OpenRead()
26             '== 避免壓縮到「隱藏檔」或是「已經壓縮過的檔案」
27             If (File.GetAttributes(fi.FullName) And FileAttributes.Hidden) <> FileAttributes.Hidden And fi.Extension <> ".gz" Then
28
29                 ' Create the compressed file.
30                 Using outFile As FileStream = File.Create(fi.FullName + ".gz")
31                     Using Compress As GZipStream = New GZipStream(outFile, CompressionMode.Compress)
32                         ' Copy the source file into the compression stream.
33                         inFile.CopyTo(Compress)
34
35                         Label1.Text = Label1.Text & "Compressed " & fi.Name & " from " & fi.Length.ToString() & " to " & outFile.Length.ToString() & " bytes.<br/>"
36                     End Using
37                 End Using
38             End If
39
40         End Using
41     End Sub

 

===========================================================================

 

不過,在壓縮的過程中, MSDN提供的範例有一個小問題需要克服

如果這個目錄下,參雜了「尚未壓縮的檔案」與「已經壓縮的檔案」,範例便會出現異常。

因為這個解壓縮的範例,會先找附檔名,例如「.doc.gz」
然後,附檔名改成 .doc檔,再來還原。

如果遇見「尚未壓縮的檔案(如 .doc)」就會報錯 -- 檔案不符合 .gz 串流。
只要一個簡單的 if 判別式就能解這個問題了。

我修改以後的檔案,名為 File_DeCompression.aspx
 

01 '=== 進行壓縮,必須宣告這兩個 NameSpace ===
02 '=== 進行壓縮,必須宣告這兩個 NameSpace ===
03 Imports System.IO
04 Imports System.IO.Compression

05 '=== 進行壓縮,必須宣告這兩個 NameSpace ===
06
07
08     Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
09         '== 此範例會壓縮某一個目錄下,所有的檔案。
10         '== 請先設定一個檔案,底下存放一些 .txt檔
11
12         Dim dirpath As String = "c:\MIS2000Lab_ASP.NET_Log"
13         Dim dir As DirectoryInfo = New DirectoryInfo(dirpath)
14
15         '== 壓縮某一個目錄下,所有的檔案。(更下層的子目錄,本範例無法壓縮)
16         For Each fi As FileInfo In dir.GetFiles()
17             DeCompress(fi)
18         Next
19
20     End Sub

21
22
23     Private Sub DeCompress(ByVal fi As FileInfo)
24         ' Get the stream of the source file.
25         Using inFile As FileStream = fi.OpenRead()
26             '== 取得檔案壓縮前的附檔名,例如:report.doc.gz檔案,壓縮之前是一個 .doc檔案
27
28             Dim curFile As String = fi.FullName
29
30             '== 注意!!目錄下,只有附檔名「.gz」壓縮檔,才會進行解壓縮。
31             If Right(curFile, 3) = ".gz" Then
32                 Dim origName As String = curFile.Remove(curFile.Length - fi.Extension.Length)
33
34                 '== 解開壓縮檔
35                 Using outFile As FileStream = File.Create(origName)
36                     Using Decompress As GZipStream = New GZipStream(inFile, CompressionMode.Decompress)
37
38                         ' Copy the decompression stream into the output file.
39                         Decompress.CopyTo(outFile)
40
41                         Label1.Text = Label1.Text & "<br />Decompressed from " & fi.Name & " to " & origName
42                     End Using
43                 End Using
44             End If
45
46         End Using
47     End Sub


===========================================================================

因為資料來源與範例,均是引用自 MSDN。


小弟不敢藏私,分享如下:Ch17_File_Compression.rar(VB 與 C#範例都有)

 


這兩個檔案(一個進行壓縮、另一個解壓縮),可以當成「ASP.NET專題實務」一書,
第十七章 File與 I/O 的 補充習題。


謝謝各位。

 

 

 

 

 

 

 

 

 

今日值班正妹,北川景子  (最近日本台有撥她的連續劇)

   

 


 

 

......  寄信給我    mis2000lab (at) 雅虎.com.台灣  ....................................................................................................
ASP.NET 4.0 專題實務 ( I )--入門實戰篇   ASP.NET 4.0 專題實務(I)(松崗出版,VB版  / C#版

範例比上一本書增加 166%,內容(頁數)增加 135%        上 / 下兩集 (2010年)已經出版囉 ~ 歡迎到此參加團購


ASP.NET專題實務( II ):範例集 與 4.0新功能(文魁出版)

.................................................................................................... 寄信給我    mis2000lab (at) 雅虎.com.台灣 ........

arrow
arrow
    全站熱搜

    MIS2000 Lab 發表在 痞客邦 留言(0) 人氣()