次の方法で共有


ストリームの圧縮・解凍方法

download.gifサンプル コードのダウンロード (vbmigtips_GZipStream.msi, 481 KB)

データの送受信を行う場合などで、通信速度を上げるためにデータを圧縮したい場合があると思います。そこで今回は、ストリームの圧縮と解凍方法について紹介します。

Visual Basic 6.0 や Visual Basic .NET で、ストリームの圧縮や解凍を行う場合、Win32API を使用します。そのため、実装に手間がかかりました。一方、Visual Basic 2005 では、新たに System.IO.Compression.GZipStream クラスが追加されたことにより、ストリームの圧縮や解凍を簡単に行えるようになりました。今回、図1 のようなアプリケーションを作成し、ファイル欄に指定したファイルを圧縮又は解凍を行います。

 図
 図 1

まずは、ストリームの圧縮方法について紹介します。実装コードは以下のとおりです。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim fileStream As New FileStream(TextBox1.Text, FileMode.Open)
    Dim buffer(fileStream.Length) As Byte
    fileStream.Read(buffer, 0, CInt(fileStream.Length))
    fileStream.Close()
	
    fileStream = New FileStream(TextBox1.Text & ".zip", FileMode.Create)
    Dim gZipStream As New Compression.GZipStream(fileStream, CompressionMode.Compress, False)
    gZipStream.Write(buffer, 0, buffer.Length)
	
    MessageBox.Show("圧縮完了")
End Sub

リスト 1

上記(リスト1)の「Dim fileStream As New FileStream(TextBox1.Text, FileMode.Open」で、圧縮するファイルのコンテンツを開き、「fileStream.Read(buffer, 0, CInt(fileStream.Length))」で読み込みます。そして、「Dim gZipStream As New Compression.GZipStream(fileStream, CompressionMode.Compress, False)」で、GZipStream の新しいインスタンスを作成し、「gZipStream.Write(buffer, 0, buffer.Length)」で、メモリストリームに読み込んだ情報を書き込みます。これにより、ファイルコンテンツが圧縮されます。上記を実装し、ファイル欄に圧縮するファイルをフルパスで指定します。そして、[圧縮]ボタンをクリックすると、指定したファイルが gzip 形式で圧縮され、「圧縮完了」のメッセージボックスが表示されます(図2)。

 図
 図 2

続いては、圧縮されているファイルを解凍する方法を紹介します。実装コードは以下のとおりです。

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim file As String = TextBox1.Text
    If Path.GetExtension(file) = ".zip" Then
        Dim fileStream = New FileStream(file, FileMode.Open)
        Dim gZipStream = New Compression.GZipStream(fileStream, CompressionMode.Decompress)
        Dim tailleOctets(4) As Byte
        Dim position As Integer = System.Convert.ToInt32(fileStream.Length - 4)
		
        fileStream.Position = position
        fileStream.Read(tailleOctets, 0, 4)
        fileStream.Position = 0
		
        Dim tailleFichier As Integer = BitConverter.ToInt32(tailleOctets, 0)
        Dim buffer(tailleFichier + 100) As Byte
        Dim monOffset As Integer = 0
		
        Do
            Dim decompressionOctets As Integer = gZipStream.Read(buffer, monOffset, 100)
            If decompressionOctets = 0 Then
                Exit Do
            End If
            monOffset += decompressionOctets
        Loop
		
        file = Microsoft.VisualBasic.Left(file, Len(file) - 4)
        fileStream = New FileStream(file, FileMode.Create)
        fileStream.Write(buffer, 0, tailleFichier - 1)
        fileStream.Flush()
        fileStream.Close()
        gZipStream.Close()
		
        MessageBox.Show("解凍完了")
    Else
        MessageBox.Show("解凍できません")
    End If
End Sub

リスト 2

上記(リスト2)の「Dim fileStream = New FileStream(file, FileMode.Open)」で、解凍する圧縮ファイルのコンテンツを開き、「Dim gZipStream = New Compression.GZipStream(fileStream, CompressionMode.Decompress)」で、ファイルを解凍します。そして、「Dim decompressionOctets As Integer = gZipStream.Read(buffer, monOffset, 100)」で、解凍されたファイルの情報を格納し、「fileStream = New FileStream(file, FileMode.Create)」「fileStream.Write(buffer, 0, tailleFichier - 1)」でファイルに書き込みます。上記を実装し、ファイル欄に解凍するするファイルをフルパスで指定します(図3)。

 図
 図 3

そして、[解凍]ボタンをクリックすると、指定したファイルが解凍され、「解凍完了」のメッセージボックスが表示されます(図4)。

 図
 図 4