はじめに
サイズの大きなファイルや、複数のファイルを1つにまとめる事ができるファイル圧縮技術は、ファイル管理には欠かせないものになっています。その中でも、ZIP形式の圧縮技術は、Windows VistaからはOS標準で搭載されており、専用のアプリケーションがなくても圧縮・解凍が可能になっています。
しかし、一度圧縮したZIPファイルの中身を確認するとなると、解凍して1つ1つのファイルを開かなくてはならないという、面倒な操作を行うことになります。ZIPファイルを指定するだけで、その中身を取り出して表示してくれるアプリケーションがあると便利ですね。
そこで、ComponentOne Studio 2010JのPowerTools ZIP for .NETにあるC1Zipコントロールを使い、画像を圧縮したZIPファイルを指定するだけで中身の画像ファイルを取り出し、ファイル名とともに表示してくれるアプリケーションを作成しました。
対象読者
Visual Basic/Visual C# 2005/2008を使ってプログラムを作ったことのある人
必要な環境
Visual Basic 2005/2008、Visual C# 2005/2008、Visual Studio 2005/2008でプログラムが作れる環境。なお、本プログラムはWindows Vista上で動作するVisual Studio 2008を使用して作成し、動作確認を行っています。
プログラム実行時の注意事項
ZIP for .NETのC1Zipコントロールを使って作成したアプリケーションを配布する場合、ZIP for .NETのアセンブリファイルを添付する必要があります。アプリケーションを正常に動作させるためには、次のファイルをインストールする必要があります。
ファイル | 内容 |
---|---|
C1.C1Zip.2.dll | C1Zipコントロール(Visual Studio 2005/2008用) |
このファイルを、プログラムを実行するフォルダにフォルダ構成を変えずに格納します。
コンポーネントのインストール
はじめてZIP for .NETのC1Zipコントロールを使用する方は、Visual Studio、Visual Basic、Visual C#の開発環境にComponentOne Studio Enterprise 2010Jをインストールする必要があります。インストーラは、グレープシティのWebページからダウンロードできます。
製品ページの[申込フォーム]をクリックし、グレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきますので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
ZIP for .NETのC1Zipコントロールは、インストールしてもVisual Studioのツールボックスに表示されません。コントロールという形態ではなくDLLで機能が提供されているためで、C1Zipコントロールを使用する場合はDLLに対してプロジェクトの「参照設定」を行う必要があります。
ソリューションエクスプローラの「参照設定」の上でショートカットメニューを表示し、[参照の追加]を選びます。そして、「.NET」のコンポーネント名が「ComponentOne C1Zip JPN」を選択します。
C1Zipコントロールについて
C1Zipコントロールは、ZIP形式のファイル圧縮・展開機能を提供するコントロールです。ZIPファイルの作成、圧縮ファイルの解凍と一部ファイルの取出し、圧縮ファイルの追加・管理などの操作を行うことができます。また、操作対象はファイルだけでなく、フォルダごとの圧縮・解凍を行うことができます。
さらに、ZIPファイルの操作はディスクに対してだけでなく、メモリやネットワークなど「ストリーム」に対して行うことができます。配列変数で直接処理を行うことができるので、データをいちいちディスクに落とす必要がなく、その分高速な処理を行うことができます。
C1Zipコントロールでの処理は、次の3種類のクラスを使って行われます。
クラス | 説明 |
---|---|
C1ZipFile/C1ZipEntry/C1ZipEntryCollection | ZIPファイルを作成する/開く/管理する操作を行うクラス |
C1ZStreamReader/C1ZStreamWriter | .NETストリーム(メモリ、ファイル、ネットワークの各ストリームなど)でのデータの圧縮/展開を行うクラス |
ZStream | ZlibのC#実装を行うクラス |
C1ZStreamReaderとC1ZStreamWriterクラスは、ZIPファイル内のデータはもちろん、あらゆる.NETストリーム上でデータ圧縮・解凍を行うクラスです。
通常のストリームに付加することで、これらのクラスを介してデータの読み取りと書き込みを行います。従って、例えばADO.NETでデータベースのテーブルデータをそのまま読み込んで直接圧縮したり、ZIPファイルの中の圧縮ファイルを取り出して直接コントロールで表示したり、といった操作が可能になります。
ZIPファイルから画像ファイルを読み込むアプリケーションの作成
では、さっそくこのC1Zipコントロールを使ったアプリケーションを作成しましょう。今回作成するアプリケーションは、次のような機能を持ちます。操作対象のZIPファイルは、画像ファイルだけを格納しているZIPファイルです。
- 画像ファイル(JPEGファイル)を4つ圧縮したZIPファイル「images.zip」を開き、JPEGファイルを1つずつストリームに読み出す
- 読み出したJPEGファイルをPictureBoxコントロールでフォームに表示する
- そのファイル名をLabelコントロールでPictureBoxコントロールの下に表示する
- 画像ファイル以外のファイルを格納しているZIPファイルを指定した場合は、処理を中止する
なお、PictureBox・Labelコントロールはコードから作成します。
GUIのデザイン
デザイン時に作成するフォームと、実行時のフォームのレイアウトは次のようになります。
デザイン時の各コントロールのプロパティは、次のように設定します。
オブジェクト | プロパティ | 設定値 |
---|---|---|
Form1 | Text | ZIPファイルから画像ファイルを読み込むアプリケーション |
Button1 | Text | 画像の取り出し... |
Label1 | Text | "" |
Border | Fixed3D | |
Panel1 | Border | Fixed3D |
Dock | Top | |
Panel2 | Border | Fixed3D |
Dock | Fill | |
OpenFileDialog1 | FileName | *.zip |
Filter | *.zip|*.zip |
ZIPファイルを開く処理
では、最初にZIPファイル「images.zip」を開く処理を作成します。処理は、すべてButtonコントロールのClickイベントハンドラで行います。ZIPファイルの指定は、「ファイルを開くダイアログボックス」を使用します。
まず、「System.IO」「C1.C1Zip」の2つの名前空間への参照を設定します。そして、「ファイルを開くダイアログボックス」を表示し、ZIPファイルのファイル名を取得します。取得したファイル名はLabelコントロールで表示します。
Imports System.IO Imports C1.C1Zip Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim w, h, i As Integer Dim fname As String Dim ret As DialogResult = OpenFileDialog1.ShowDialog() If ret = DialogResult.Cancel Then MessageBox.Show("キャンセルボタンが押されました。" & Chr(13) & _ "操作をキャンセルします", "操作の中止", _ MessageBoxButtons.OK, MessageBoxIcon.Stop) Exit Sub Else fname = OpenFileDialog1.FileName Label1.Text = fname End If
using System.IO; using C1.C1Zip; namespace myzip_cs { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int w, h, i; string fname; DialogResult ret= openFileDialog1.ShowDialog(); if(ret == DialogResult.Cancel) { ret = MessageBox.Show("キャンセルボタンが押されました。" + "\r\n" + "処理を終了します", "操作の中止", MessageBoxButtons.OK, MessageBoxIcon.Stop); return; }else { fname = openFileDialog1.FileName; label1.Text = fname; }
取得したファイル名を使ってZIPファイルを開きます。まず、C1ZipFileクラスのインスタンスを作成します。そして、Openメソッドを使ってZIPファイルを開きます。
ファイルを開いたら、Entriesプロパティで現在開いているZIPファイル内のエントリのコレクションクラス「C1ZipEntryCollection」を取得します。このコレクションには、ZIPファイル内に圧縮されているファイルの情報が「C1ZipEntryオブジェクト」として格納されています。
また、コレクションのCountプロパティを調べると、圧縮されているファイル数が把握できるので、これを確認します。もし、何も格納されていなければ、ここで処理を中止します。
'ZIPファイルを開く Dim zip As New C1ZipFile() zip.Open(fname) 'ZIP内のファイル数の確認 Dim cnt As Integer = zip.Entries.Count If cnt = 0 Then MessageBox.Show("読み込むファイルがありません") Exit Sub End If
//ZIPファイルを開く C1ZipFile zip = new C1ZipFile(); zip.Open(fname); //ZIP内のファイル数の確認 int cnt = zip.Entries.Count; if( cnt == 0) { MessageBox.Show("読み込むファイルがありません"); return; }
画像ファイルを取り出しPictureBoxで表示する処理
ZIPファイルに格納されているファイル数が分かったら、続いて画像ファイルを1つずつ読み出し、PictureBoxコントロールとLabelコントロールを作成して、フォームのパネルに表示していきます。格納されているファイル数が分かったので、その数だけ処理を繰り返していきます。
まず、C1ZipEntryCollectionから最初のJPEGファイルのC1ZipEntryオブジェクトにアクセスし、OpenReaderメソッドで画像ファイルを読み出します。OpenReaderメソッドは、ディスクに抽出せずにZIP内に格納されたファイルを、データの読み取りに使用できる「C1ZStreamReader」というStreamオブジェクトとして返してきます。そして、ファイルから読み取るときにデータは自動的に圧縮解除されるので、このOpenReaderメソッドを実行するだけで、ZIPファイル内の圧縮ファイルを取り出すことができます。
'画像ファイルを取り出しPictureBoxで表示する Dim s As Stream w = 150 h = 100 For i = 0 To cnt - 1 '画像ファイルをストリームに読み込む s = zip.Entries(i).OpenReader()
//画像ファイルを取り出しPictureBoxで表示する Stream s; w = 150; h = 100; for(i=0; i<=cnt-1;i++) { //画像ファイルをストリームに読み込む s = zip.Entries[i].OpenReader();
次に、PictureBoxコントロールを作成してImageプロパティに画像をセットし、パネル「Panel2」に組み込みます。また、Labelコントロールも作成し、Textプロパティにファイル名を設定し、PictureBoxコントロールの下に配置します。
このとき、Try...Catch
ステートメントを使用して、PictureBoxコントロールへの画像セットのエラー処理を設定しておきます。もし、Imageオブジェクト以外のファイルが解凍された場合は、メッセージボックスで表示し処理を中止します。最後に、ストリームを閉じます。
この処理を、ZIPファイル内のファイル数ぶん繰り返します。
Try 'PictureBoxを作成して画像をセットしパネルに組み込む Dim pb As New PictureBox pb.Image = CType(Image.FromStream(s), Image) pb.Visible = True pb.SizeMode = PictureBoxSizeMode.StretchImage pb.Size = New Size(w, h) pb.Left = ((w + 5) * i) + 5 pb.Top = 10 Me.Panel2.Controls.Add(pb) 'ファイル名の設定 fname = zip.Entries(i).FileName Dim lbl As New Label lbl.Text = fname lbl.Visible = True lbl.Left = ((w + 5) * i) + 5 lbl.Top = 120 Me.Panel2.Controls.Add(lbl) Catch ex As Exception MessageBox.Show("指定された形式のZIPファイルではありません。" + Chr(13) _ + "もう一度ファイルを選んでください", ex.Message, _ MessageBoxButtons.OK, MessageBoxIcon.Stop) Exit Sub End Try s.Close() Next End Sub End Class
try { //PictureBoxを作成して画像をセットしパネルに組み込む PictureBox pb = new PictureBox(); pb.Image = Image.FromStream(s); pb.Visible = true; pb.SizeMode = PictureBoxSizeMode.StretchImage; pb.Size = new Size(w, h); pb.Left = ((w + 5) * i) + 5; pb.Top = 10; panel2.Controls.Add(pb); //ファイル名の設定 fname = zip.Entries[i].FileName; Label lbl = new Label(); lbl.Text = fname; lbl.Visible = true; lbl.Left = ((w + 5) * i) + 5; lbl.Top = 120; panel2.Controls.Add(lbl); }catch( Exception ex) { ret = MessageBox.Show("指定された形式のZIPファイルではありません。" + "\r\n" + "もう一度ファイルを選んでください", ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } s.Close(); } } } }
まとめ
C1Zipコントロールは、市販のZIPアプリケーションと違い、ファイル圧縮・解凍機能を直接アプリケーションに実装させることができ、圧縮ファイルの追加・削除、読み出し、格納情報の取得などZIPファイルを自在に操作できます。
また、ファイルシステムだけでなく.NETのストリームを使うことができるので、オンメモリでデータをすぐに圧縮することもでき、高速に圧縮処理を行うことができます。パスワードの設定もできるので、圧縮機能と合わせデータのセキュリティ設定にも役立つ機能をアップロードに組み込むことも可能です。
サンプルプログラムで使用している写真は、すべて「アルペンガーデンやまくさ」が所有しています。無断で、転載・販売・掲載することを禁止します。