とあるプログラマーの覚書

Visual Basic .NET編:ファイルのZIP圧縮方法

スポンサーリンク

本日は、VB.NETでのファイルのZIP圧縮方法をご紹介したいと思います。
こんな簡単そうでよく使われそうな機能、なんで標準で用意してくれてないんだよ!と思いましたが、やってみると案外簡単に実現出来ましたので、紹介したいと思います。

ZIP圧縮の方法は、一通りではありません。軽く調べただけでも、以下のような方法があります。
・Visual J#のライブラリを使う
・#ziplib(SharpZipLib)というライブラリを使う
・DotNetZip(Ionic Zip Library)というライブラリを使う
その他にもいくつかあるようです。

個人で作るフリーソフトの実装に使うのであれば、どんな手段でもいいと思いますが、会社の仕事として使う場合には、フリーで配布されているようなDLLを使ったりするのは、少々憚られますよね。責任とかライセンスとかの問題で。
という事で、マイクロソフトの「Visual J#のライブラリを使う」という方法が、最もよいのではないかと考えました。

というわけで、説明に入りたいと思います。
その前に、今回は、Visual Basic.NET 2008を前提にしています。2005でも2010でも大丈夫だと思いますが確認はしていません。
.NET Framework 2.0以降のバージョンであればOKと思います。それ以前でも実装は出来るそうですが、不具合があるとか。それは後述します。


1.Visual J#のライブラリのインストール
まずは、Visual J# 2.0のライブラリが必要になります。
Visual Studio 2005?をインストールしていれば不要かもしれませんが、「C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727」のディレクトリに、「vjslib.dll」というファイルが無い場合は以下のURLより、「Microsoft Visual J# 2.0 再頒布可能パッケージ」をダウンロード、インストールしてください。
公式のダウンロード センターから Visual J# 2.0 再頒布可能パッケージ をダウンロード


2.vjslib.dllを参照設定に追加
ZIP圧縮機能を実装したいプロジェクトをVisual Studioで開き、ソリューションエクスプローラの「参照の追加」を選択してください。
「.NET」タブに「vjslib」という項目があるはずですので、それを選択してください。
もしくは、「参照」タブから、ダウンロードしたvjslib.dllを指定してもよいと思います。
これで、前準備は終了です。


3.実装
実装方法は、以下のページが参考になります。
J#のライブラリを使ってZIP圧縮、展開(解凍)、リスト表示を行う: .NET Tips: C#, VB.NET
サンプルとしては以下のようなコードです。


Dim zipPath As String = “C:\test.zip”
‘複数ファイルを圧縮したい場合は、下記の配列に追加
Dim filePaths As String() = {“C:\test1.xls”}

Dim fos As New java.io.FileOutputStream(zipPath)
Dim zos As New java.util.zip.ZipOutputStream(fos)
Dim file As String

For Each file In filePaths
  Dim f As String = System.IO.Path.GetFileName(file)
  Dim ze As New java.util.zip.ZipEntry(f)
  ze.setMethod(java.util.zip.ZipEntry.DEFLATED)
  zos.putNextEntry(ze)

  Dim fis As New java.io.FileInputStream(file)
  Dim buffer(8191) As System.SByte

  While True
    Dim len As Integer = fis.read(buffer, 0, buffer.Length)
    If len < = 0 Then       Exit While     End If     zos.write(buffer, 0, len)   End While   fis.close()   zos.closeEntry() Next file zos.close() fos.close()


上記コードは、あくまで圧縮したいファイルがあらかじめわかっているときのサンプルですので、それほど汎用的なコードではありませんが、圧縮したいファイルの一覧の取得等は、その都度、実現したい仕様に合せてください。

これで、ファイルのZIP圧縮が簡単に行えました。
それにしても、ZIP圧縮ぐらいは、標準APIでパッと出来るようにして欲しいもんです。

なお、この方法は、.NET Framework2.0より前のバージョンだと、以下のような不具合があるそうです。(確認はしていません。)
・日本語を含むファイルを圧縮すると、正常にZip圧縮ファイルが作成されない。
・サイズの大きいバイナリファイルを圧縮すると、エラーが発生する場合がある。

今回は以上です。


スポンサーリンク

URL :
TRACKBACK URL :

Leave a Reply

*
* (公開されません)

*

*

Return Top