這兩個檔案(一個進行壓縮、另一個解壓縮),可以當成「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 (進行壓縮)
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
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
線上課程教學,遠距教學 (Web Form 約 51hr) https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015
線上課程教學,遠距教學 (ASP.NET MVC 約 140hr) https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab
寫信給我,不要私訊 -- mis2000lab (at) yahoo.com.tw 或 school (at) mis2000lab.net
(1) 第一天 ASP.NET MVC5 完整影片(5.5小時 / .NET 4.x版)免費試聽。影片 https://youtu.be/9spaHik87-A
(2) 第一天 ASP.NET Core MVC 完整影片(3小時 / .NET Core 6.0~8.0)免費試聽。影片 https://youtu.be/TSmwpT-Bx4I
[學員感言] mis2000lab課程評價 - ASP.NET MVC , WebForm 。 https://mis2000lab.medium.com/%E5%AD%B8%E5%93%A1%E6%84%9F%E8%A8%80-mis2000lab%E8%AA%B2%E7%A8%8B%E8%A9%95%E5%83%B9-asp-net-mvc-webform-77903ce9680b
ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。
......... facebook社團 https://www.facebook.com/mis2000lab ......................
......... YouTube (ASP.NET) 線上教學影片 https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/
Blog文章 "附的範例" 無法下載,請看 https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download
請看我們的「售後服務」範圍(嚴格認定)。
......................................................................................................................................................
ASP.NET MVC => .NET Core MVC 線上教學 ...... 第一天課程 完整內容 "免費"讓您評估 / 試聽
[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講 事先錄好的影片,並非上課側錄! 觀看時,有如「一對一」面對面講課。