[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