ストリームの圧縮・解凍方法
サンプル コードのダウンロード (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