处理压缩事件
现在,既然定义好了主要的压缩和解压例程,那么接下来你就可以为各种按钮进行编码了。相应于Compress按钮的事件处理器如下:
Private Sub BTnCompress_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnCompress.Click
'---用来存储压缩的数据---
Dim compressedData() As Byte
'---压缩数据---
If rbGZipStream.Checked Then
compressedData = Compress("Gzip",System.Text.Encoding.ASCII.GetBytes(txtBefore.Text))
Else
compressedData = Compress("Deflate",System.Text.Encoding.ASCII.GetBytes(txtBefore.Text))
End If
'---把压缩的数据复制到一个字符串中---
Dim i As Integer
Dim s As New System.Text.StringBuilder()
For i = 0 To compressedData.Length - 1
If i <> compressedData.Length - 1 Then
s.Append(compressedData(i) & " ")
Else
s.Append(compressedData(i))
End If
Next
'---显示压缩的数据为一个字符串---
txtAfter.Text = s.ToString
End Sub
在txtBefore控件中的数据被转换成一个字节数组,然后被压缩。然后,该压缩的数据被转换成字符串以便于在txtAfter中显示。
相应于Decompress按钮的事件处理器如下:
Private Sub btnDecompress_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnDecompress.Click
'---把压缩的字符串格式化成一个字节数组---
Dim eachbyte() As String = txtAfter.Text.Split(" ")
Dim data(eachbyte.Length - 1) As Byte
For i As Integer = 0 To eachbyte.Length - 1
data(i) = Convert.ToByte(eachbyte(i))
Next
'---解压数据并且显示解压的数据---
If rbGZipStream.Checked Then
txtBefore.Text = System.Text.Encoding.ASCII.GetString(Decompress("Gzip", data))
Else
txtBefore.Text = System.Text.Encoding.ASCII.GetString(Decompress("Deflate", data))
End If
End Sub
它把显示在控件txtAfter中的数据转换成一个字节数组,然后发送它以便进行解压。解压缩的数据被显示回txtBefore控件中。
相应于"Select file to compress"按钮的事件处理器代码如下:
Private Sub btnSelectFile_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnSelectFile.Click
'---让用户选择一个要压缩的文件--
Dim openFileDialog1 As New OpenFileDialog()
'openFileDialog1.InitialDirectory = "c:/"
openFileDialog1.Filter = "All files (*.*)*.*"
openFileDialog1.RestoreDirectory = True
If openFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
'---把文件的内容读入字节数组---
Dim fileContents As Byte()
fileContents = My.Computer.FileSystem.ReadAllBytes(openFileDialog1.FileName)
'---创建gzip文件---
Dim filename As String = openFileDialog1.FileName & ".gzip"
If File.Exists(filename) Then File.Delete(filename)
Dim fs As FileStream = New FileStream(filename, FileMode.CreateNew, File
access.Write)
'---压缩文件的内容---
Dim compressed_Data As Byte()
If rbGZipStream.Checked Then
compressed_Data = Compress("Gzip", fileContents)
Else
compressed_Data = Compress("Deflate", fileContents)
End If
If compressed_Data IsNot Nothing Then
'---把压缩的内容写进压缩的文件中---
fs.Write(compressed_Data, 0, compressed_Data.Length)
fs.Close()
End If
End If
End Sub
它读取由用户选择的文件的内容,压缩它,并且创建一个包含压缩的数据的新文件(具有一样的文件名,但是加上了一个.gzip扩展名)。
相应于"Select file to Decompress"按钮的事件处理器代码如下:
Private Sub btnDecompressFile_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnDecompressFile.Click
'---让用户选择一个要解压的文件---
Dim openFileDialog1 As New OpenFileDialog()
' openFileDialog1.InitialDirectory = "c:/"
openFileDialog1.Filter = "All GZIP files (*.gzip)*.gzip"
openFileDialog1.RestoreDirectory = True
If openFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
'---把压缩的文件的内容读入到字节数组---
Dim fileContents As Byte()
fileContents = My.Computer.FileSystem.ReadAllBytes(openFileDialog1.FileName)
'---解压文件的内容---
Dim uncompressed_Data As Byte()
If rbGZipStream.Checked Then
uncompressed_Data = Decompress("Gzip", fileContents)
Else
uncompressed_Data = Decompress("Deflat", fileContents)
End If
'---创建解压的文件---
Dim filename As String = openFileDialog1.FileName.Substring(0, openFileDialog1.FileName.Length - 5)
If File.Exists(filename) Then File.Delete(filename)
Dim fs As FileStream = New FileStream(filename,FileMode.CreateNew, FileAccess.Write)
If uncompressed_Data IsNot Nothing Then
'---把解压内容写入到文件中---
fs.Write(uncompressed_Data, 0, uncompressed_Data.Length)
fs.Close()
End If
End If
End Sub
它读取用户选择的文件的内容,解压之,并且创建一个包含解压的数据的新文件(通过去掉它的.gzip扩展名)。进入讨论组讨论。
测试应用程序
按F5测试应用程序(见图2)。
图2.测试应用程序:选择使用的压缩算法,然后你可以压缩一个文本串或一个文件内容。
你应该注重下列事实:
· 压缩小数量的文本实际上将会导致一种较大的压缩文本。
· 不同的文本将产生不同的压缩比,尽管字符数是固定的。
· 文本文件压缩效果最好;它们能够带来最好的压缩比。
· 其它二进制的文件,例如.exe,jpg,通常压缩效果并不很好并且可能会导致大于百分比之100的压缩比,这是没有价值的。
需要注重的是,.NET中的GZIP和Deflate算法的实现要比市场上的其它第三方GZIP工具具有较低的效率。尽管你能够使用.NET类把10MB的数据压缩到4MB,但是你发现使用一种第三方工具可能会达到一种更小的压缩大小。另外,这个压缩类无法操作大于4GB的数据。然而,在.NET中的实现将答应你解压使用市场中的其它GZIP工具压缩的所有的文件。
小结
在本文中,你已经看到了如何在.NET 2.0中使用压缩类。尽管这种实现还不如市场上的那些非MS方案有效,但是它的确为你提供了一种轻易(免费)的方式来在你的.NET应用程序中加入压缩功能。进入讨论组讨论。