はじめに
ファイルやフォルダを圧縮するZipファイルは、ディスクスペースの活用や複数のファイルを一括管理するのに役立っていますが、圧縮・展開するのに専用のアプリケーションを必要とします。Windows VistaやWindows 7はデフォルトでこのファイル圧縮・展開機能を持っていますが、そのための操作は別途必要となります。
ComponentOne Studio Enterprise 2011J(または、ComponentOne Studio for Windows Forms 2010J、ComponentOne Studio for ASP.NET 2010J)のZIP for .NETに収録されているC1Zipコントロールは、メモリストリームなどから直接データを圧縮ファイルにできるコンポーネントです。今回は、テキストボックスに入力されたテキストをそのままZipファイルに保存したり、Zipファイルから直接テキストを読み出すアプリケーションを作成してみました。
対象読者
Visual Basic、Visual C# 2010を使ってプログラムを作ったことのある人
必要な環境
Visual Basic 2010、Visual C# 2010、Visual Studio 2010でプログラムが作れる環境。なお、本プログラムはWindows Vista上で動作するVisual Studio 2010を使用して作成し、動作確認を行っています。
PDF for .NETを使って作成したアプリケーションを配布する場合、アセンブリファイルを添付する必要があります。アプリケーションを正常に動作させるためには、次のファイルをインストールしてください。
ファイル | 内容 |
C1.C1Pdf.2.dll | 本体アセンブリ |
C1.C1Pdf.4.dll | 本体アセンブリ(※) |
C1.C1Pdf.4.Design.dll | デザイナアセンブリ(※) |
上記のファイルを、プログラムを実行するフォルダにフォルダ構成を変えずに格納します。なお、本サンプルプログラムを実行するには、Adobe Readerがインストールされている必要があるため、ご注意ください。
コンポーネントのインストール
この記事の手順を試すには、Visual Studio、Visual Basic、Visual C#の開発環境にComponentOne Studio Enterprise 2011J(または、ComponentOne Studio for Windows Forms 2010J、[ComponentOne Studio for ASP.NET 2010J)をインストールする必要があります。インストーラは、グレープシティのWebページからダウンロードできます。
製品のトライアル版一覧ページにてダウンロードしたい製品にチェックを入れ、ページ右上部の[申込フォーム]をクリックしてグレープシティのWebサイトへ必要情報を登録すると、添付トライアルライセンスキーファイルとダウンロードサイトを記載したE-Mailが送られてきますので、ここからダウンロードします。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
参照の追加
ComponentOne Studio Enterprise 2011J(または、ComponentOne Studio for Windows Forms 2010J)をインストールしたら、プロジェクトに参照を追加します。
ZIP for .NETは、UIを持つコントロールではなく、プロセスを提供するコントロールなので、ツールボックスに登録してフォームに配置するのではなく、DLLに対してプロジェクトの参照設定を行う必要があります。[参照の追加]から、コンポーネント名が「ComponentOne C1Zip JPN」で、バージョンが「4.1.2010...」のものを選択し、設定してください。
ファイル名 | 説明 |
C1.C1Zip.2.dll | 本体アセンブリ |
C1.C1Zip.4.dll | 本体アセンブリ(※) |
C1.C1Zip.4.Design.dll | デザイナアセンブリ(※) |
C1Zipコントロールについて
C1Zipコントロールは、Zip形式の圧縮・展開を可能にするC1ZipFile、C1ZipEntry、
C1ZipEntryCollectionという3つのクラスを提供しています。
これらのクラスは、C1Zipライブラリの中で最高位に位置するもので、Zipファイルを作成、管理する機能を提供します。Zipファイルの内容を調べたり、その完全性をテストしたり、Zipファイルに対してエントリを追加、削除、抽出したりなどが可能です。
-
C1ZipFileクラス
Zipファイルをカプセル化します。C1ZipFileオブジェクトを作成したら、それを既存のZipファイルに付加するか、このオブジェクトに指示して新しい空のZipファイルを作成できます。
-
C1ZipEntryクラス
元のファイルの名前、サイズ、圧縮サイズなどの各エントリを記述するプロパティとメソッドを提供します。また、ストリームオブジェクトを返すOpenReaderメソッドも持っているため、先に展開せずにエントリの内容を読み取ることができます。
また、C1ZStreamReader、C1ZStreamWriterクラスでは、Zipファイル内のデータはもちろん、あらゆる.NETストリーム上(メモリ、ファイル、ネットワークの各ストリームなど)でデータ圧縮を使用できます。
C1ZStreamReaderオブジェクトとC1ZStreamWriterオブジェクトを使用するには、これらのオブジェクトを通常のストリームに付加し、これらを介してデータの読み取りと書き込みを行います。データは基底のストリームに対してオンザフライで圧縮(または展開)されます。この設計により、ネイティブの.NETストリームとうまく統合できます。
ZStreamクラスは、C1Zipライブラリの最下位クラスで、前述の上位クラスで広く使用され、大部分のユーザーはZStreamを直接使用する必要はありません。
C1Zipコントロールでできること
C1Zipコントロールは、大まかに以下のような使い方ができます。
-
メモリ内のデータを圧縮する
メモリ内の任意のデータを圧縮・展開できます。この技法は、アプリケーションの実行中にストリームを管理する場合に役立ちます。ストリームを圧縮することにより、アプリケーションのメモリ使用量を抑えることができます。
-
ファイルを圧縮する
個々のファイルを圧縮することにより、それぞれのファイルサイズを減らします。また、複数のファイルを1つにまとめることができます。
-
データをシリアル化し圧縮する
C1Zipと.NETのシリアル化を組み合わせて、通常サイズより小さいストリームにオブジェクトを保存できます。オブジェクトをXMLストリームにシリアル化している場合には、ディスク領域やネットワーク帯域幅の節約は非常に重要となる可能性があります。
-
Zipファイルの処理
Zipアーカイブ内のファイルを開いたり、検査、追加、および削除できます。Zipファイル内の個々のファイルにアクセスしデータを取りだしたり、パスワードを使用してファイルを保護することもできます。
フォームの作成
では、C1Zipコントロールを使ってプログラムを作成しましょう。
作成するプログラムは、TextBoxコントロールに入力されたテキストデータを、直接Zipファイルを作成して保存するアプリケーションです。一度テキストファイルを作成してからそれをZipファイルに圧縮するのではなく、テキストファイルの作成とZipファイルの作成を一度に行います。さらに、作成したZipファイルから直接テキストデータを読み出す機能も付加します。
GUIのデザイン
使用するコントロールは、TextBoxコントロールとButtonコントロールが3つ、というシンプルなものです。TextBoxコントロールは、MultiLineプロパティをTrueにし、スクロールバーを表示させます。
入力されたテキストデータをZip化する処理
TextBoxコントロールに入力された値を、圧縮してZipファイルに保存する処理を行います。まず、C1ZipFileクラスのCreateメソッドを使用して、保存するZipファイル名を作成します(引数はファイル名)。パス名を省略すると、実行プログラムと同じフォルダに保存されます。ファイル名を作成したら、メモリストリームを開き、TextBoxコントロールのTextプロパティの値を書き出します。
Imports System.IO Imports C1.C1Zip Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click '保存ファイルの作成 Dim zipFile As New C1ZipFile() zipFile.Create("myzipdata.zip") ' メモリストリームを開く Dim memstr As New MemoryStream() ' 圧縮ストリームにデータを書き込む Dim sw As New StreamWriter(memstr) sw.Write(TextBox1.Text) ' すべての保留データをフラッシュ sw.Flush() memstr.Position = 0
using System.IO; using C1.C1Zip; namespace zipfile_cs { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //保存ファイルの作成 C1ZipFile zipFile = new C1ZipFile(); zipFile.Create("myzipdata.zip"); // メモリストリームを開く MemoryStream memstr = new MemoryStream(); // 圧縮ストリームにデータを書き込む StreamWriter sw = new StreamWriter(memstr); sw.Write(textBox1.Text); // すべての保留データをフラッシュ sw.Flush(); memstr.Position = 0;
このメモリストリーム内のデータを、ZipファイルのEntriesクラスのAddメソッドを使用してエントリとして追加します。「エントリ」は、Zipファイル内の1つのファイル単位と思ってください。
ここで、ストリームのデータをテキストファイルに保存し、Zipファイルに追加します。これで、TextBoxコントロールの入力データをテキストファイルとZipファイルに一度に保存してしまいます。
'ZIPエントリを追加 zipFile.Entries.Add(memstr, "sample.txt") MessageBox.Show("圧縮ファイルに保存しました", "圧縮の実行", MessageBoxButtons.OK, MessageBoxIcon.Information) 'ストリームを閉じる memstr.Close()
//ZIPエントリを追加 zipFile.Entries.Add(memstr, "sample.txt"); MessageBox.Show("圧縮ファイルに保存しました", "圧縮の実行", MessageBoxButtons.OK, MessageBoxIcon.Information); //ストリームを閉じる memstr.Close();
Zipファイルから直接データを読み込む処理
Zipファイルから直接データを読み出す処理を作成します。通常は、一度Zipファイルを解凍して中のファイルを取り出しそれからデータにアクセスしますが、C1ZipコントロールではZipファイルの中身に直接アクセスできます。
アクセスの順序は、最初にZipファイルをOpenメソッドで開き、アクセスしたいファイルをエントリに指定してストリームに接続し、StreamReaderクラスのReadToEndメソッドでデータをバッファに読み出します。
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click Dim zip As New C1ZipFile() zip.Open("myzipdata.zip") ' 任意のエントリで入力ストリームを開きます。 Dim ze As C1ZipEntry = zip.Entries("sample.txt") Dim s As Stream = ze.OpenReader() ' StreamReader をストリームで開きます。 Dim sr As New StreamReader(s) TextBox1.Text = sr.ReadToEnd() ' StreamReader を使用して閉じます。 sr.Close() End Sub
private void button3_Click(object sender, EventArgs e) { C1ZipFile zip = new C1ZipFile(); zip.Open("myzipdata.zip"); // 任意のエントリで入力ストリームを開きます。 C1ZipEntry ze = zip.Entries["sample.txt"]; Stream s = ze.OpenReader(); // StreamReader をストリームで開きます。 StreamReader sr = new StreamReader(s); textBox1.Text = sr.ReadToEnd(); // StreamReader を使用して閉じます。 sr.Close(); }
まとめ
Zip形式はオープンスタンダードで、既に広く普及している多くのアプリケーションでサポートされています。Zipファイルは、多くのファイルを1つに統合でき、アプリケーションの配備がより簡単になります。また、データを圧縮することで、ディスク容量を小さくでき、ネットワーク帯域幅の節約にもなります。
C1Zipコンポーネントは、テキストデータだけでなく、バイナリデータやシリアル化されたデータ、データベースファイルなども圧縮ファイルとして保存できます。ディスクとの読み書きだけでなく、ストリームに対してもデータの圧縮・展開が行えますので、アプリケーションのメモリ上でのデータ処理でも威力を発揮することができるでしょう。