GZipStream / DeflateStream 壓縮 / 解壓縮

[url]http://www.dotblogs.com.tw/yc421206/archive/2009/01/18/6869.aspx[/url]

.NET提供了兩種壓縮資料流一個是GZipStream,另一個是DeflateStream,使用壓縮資料流要注意幾項:
[color=darkblue]1.這兩個演算法最大只能對4G的資料進行壓縮。
2.如果想要將檔案分給其它人使用,且要讓它們能夠用ZIP解壓縮時,請用GZipStream。[/color]

[color=red][b]壓縮檔案步驟:[/b][/color]
1.引用System.IO及System.IO.Compression類別
2.開啟欲壓縮的檔案
//開啟來源檔
FileStream SourceFile = File.OpenRead(inFile);
3.建立壓縮後的檔案
//建立目的地檔
FileStream DestnFile = File.Create(outFile);

4.引用壓縮資料流GZipStream,引用壓縮參數
//引用壓縮類別
GZipStream myGZip = new GZipStream(DestnFile, CompressionMode.Compress);
5.寫入資料至壓縮資料流
//設定讀被壓縮(來源檔)變數
int ByteFile = SourceFile.ReadByte();
while (ByteFile != -1)
{
//寫入myGZip資料流(壓縮)
myGZip.WriteByte((byte)ByteFile);
ByteFile = SourceFile.ReadByte();
}

6.釋放資源
//釋放資源
myGZip.Dispose();
DestnFile.Dispose();
SourceFile.Dispose();


[b][color=red]解壓縮檔案步驟:[/color][/b]
1.引用System.IO及System.IO.Compression類別
2.開啟欲解壓縮的檔案
//開啟來源檔
FileStream SourceFile = File.OpenRead(inFile);
3.建立壓縮後的檔案
//建立目的地檔
FileStream DestnFile = File.Create(outFile);
4.引用壓縮資料流GZipStream,引用解壓縮參數
//引用解壓縮類別
GZipStream myGZip = new GZipStream(SourceFile, CompressionMode.Decompress);
5.寫入資料至目的地檔案
//設定讀解壓縮(來源檔)變數
int ByteFile = myGZip.ReadByte();
while (ByteFile != -1)
{
//寫資料至目的地檔(解壓縮)
DestnFile.WriteByte((byte)ByteFile);
ByteFile = myGZip.ReadByte();
}
6.釋放資源
//釋放資源
myGZip.Dispose();
DestnFile.Dispose();
SourceFile.Dispose();


Imports System.IO
Imports System.IO.Compression
'引用命名空间
''' <summary>
''' 压缩档案
''' </summary>
''' <param name="sourceFile">源文件</param>
''' <param name="destinationFile">压缩后文件</param>
''' <remarks></remarks>
Public Function CompressFile(ByVal sourceFile As String, ByVal destinationFile As String) As Boolean
If Not File.Exists(sourceFile) Then Throw New FileNotFoundException
Dim sourceStream As FileStream = Nothing
Dim destinationStream As FileStream = Nothing
Dim compressedStream As GZipStream = Nothing
Try
sourceStream = New FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read)
Dim buffer(sourceStream.Length - 1) As Byte
Dim checkCounter As Integer = sourceStream.Read(buffer, 0, buffer.Length)
If checkCounter <> buffer.Length Then Throw New ApplicationException
destinationStream = New FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write)
compressedStream = New GZipStream(destinationStream, CompressionMode.Compress, True)
compressedStream.Write(buffer, 0, buffer.Length)
Catch ex As ApplicationException
Return False
Finally
If sourceStream IsNot Nothing Then sourceStream.Close()
If compressedStream IsNot Nothing Then compressedStream.Close()
If destinationStream IsNot Nothing Then destinationStream.Close()
End Try
Return True
End Function
''' <summary>
''' 解压缩档案
''' </summary>
''' <param name="sourceFile">压缩过的文件</param>
''' <param name="destinationFile">输出源文件</param>
''' <remarks></remarks>
Public Function DecompressFile(ByVal sourceFile As String, ByVal destinationFile As String) As Boolean
If Not File.Exists(sourceFile) Then Throw New FileNotFoundException
Dim sourceStream As FileStream = Nothing
Dim destinationStream As FileStream = Nothing
Dim decompressedStream As GZipStream = Nothing
Dim quartetBuffer(4) As Byte
Try
sourceStream = New FileStream(sourceFile, FileMode.Open)
decompressedStream = New GZipStream(sourceStream, CompressionMode.Decompress, True)
Dim position As Integer = sourceStream.Length - 4
sourceStream.Position = position
sourceStream.Read(quartetBuffer, 0, 4)
sourceStream.Position = 0
Dim checkLength As Integer = BitConverter.ToInt32(quartetBuffer, 0)
Dim buffer(checkLength + 100) As Byte
Dim offset, total As Integer
While (True)
Dim bytesRead As Integer = decompressedStream.Read(buffer, offset, 100)
If bytesRead = 0 Then Exit While
offset += bytesRead
total += bytesRead
End While
destinationStream = New FileStream(destinationFile, FileMode.Create)
destinationStream.Write(buffer, 0, total)
destinationStream.Flush()
Catch ex As ApplicationException
Return False
Finally
If sourceStream IsNot Nothing Then sourceStream.Close()
If decompressedStream IsNot Nothing Then decompressedStream.Close()
If destinationStream IsNot Nothing Then destinationStream.Close()
End Try
Return True
End Function
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值