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

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





[習題] 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 的 補充習題。


謝謝各位。

 

另一位網友 -- 余小章 @ 大內殿堂 的大作:

 

===  最後要打一下廣告  ==========================

 

1.  如果您覺得我的描述、寫作方式,符合您的胃口。

2.  如果您看完以後,知道我寫書、介紹一些控制項或是技術........不是「混過去」、「帶過去」而已,而是真真確確地蒐集 "有用的範例",讓您學得更深入!

3.  如果您覺得:我出完書以後,還不定期地提供售後服務,提供補充教材......這樣的互動是 "良性"的,是值得鼓勵的。......已經推出 兩百多篇 補充範例了

4. 如果您(尤其是學生)真的想把基礎學好,而不是 "混"過這一門課就好、而不是寫個(畢業專題的)屍體出來交差(能畢業就好).....那麼.......

 

請您購買下面的書籍,

東西多到您學不完

上 / 下兩集,兩本書的厚度(我蒐集的各種範例)將近 兩千頁 !!......絕對不會讓您失望

 

 

 

 

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

   

 

 
 

我將思想傳授他人, 他人之所得,亦無損於我之所有;

猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson

寫信給我--  mis2000lab (at) yahoo.com.台灣  或是  school (at) mis2000lab.net

................   facebook社團   https://www.facebook.com/mis2000lab   ......................

................   Google+   https://plus.google.com/100202398389206570368/posts ........

................  YouTube (ASP.NET) 線上教學影片  http://goo.gl/rGLocQ

*********************************************************************************************

*** 第一天 的 ASP.NET MVC線上課程 免費看(5.5小時)*** 

************************************************************(歡迎索取,免費申請)*****

 

ASP.NET遠距教學、線上課程(Web Form + MVC)第二門 課程「四折」-- 以MVC課程作為優惠。

第一天完整課程,提供 "完整" 試聽。  如不滿意 全額退費!

 

 

Blog文章 "附的範例" 無法下載,請看 這裡 ...... https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download

請看我們的「售後服務」範圍(嚴格認定)

......................................................................................................................................................

...................................................................................................................................................... 

[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講

事先錄製好的影片,並非上課時側錄!   觀看影片時,有如我「一對一」跟您面對面講課

 

    MIS2000 Lab.  線上教學影片(YouTube) **免費觀賞**