SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(ComponentOne)

テキストを直接Zipファイルに保存する.NETアプリケーションの作成

ComponentOne Studio Enterprise 2011JのZIP for .NETコンポーネントを使ったアプリケーションの作成

  • X ポスト
  • このエントリーをはてなブックマークに追加

 今回は、ComponentOne Studio Enterprise 2011JのZIP for .NETに収録されているC1Zipコントロールを取り上げます。このコントロールは、メモリストリームなどから直接データを圧縮するため、アプリケーションにこの機能を組み込むとデータを直接ZIPファイルとして保存できます。今回は、テキストボックスに入力されたテキストをそのままZIPファイルに保存したり、ZIPファイルから直接テキストを読み出すアプリケーションを作成してみました。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 ファイルやフォルダを圧縮する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ファイルから直接テキストを読み出すアプリケーションを作成してみました。

入力テキストを直接Zipファイルに保存する
入力テキストを直接Zipファイルに保存する
作成したZipファイルとデータファイル
作成したZipファイルとデータファイル
Zipファイルからダイレクトにテキストデータを読み出す
Zipファイルからダイレクトにテキストデータを読み出す

対象読者

 Visual Basic、Visual C# 2010を使ってプログラムを作ったことのある人

必要な環境

 Visual Basic 2010、Visual C# 2010、Visual Studio 2010でプログラムが作れる環境。なお、本プログラムはWindows Vista上で動作するVisual Studio 2010を使用して作成し、動作確認を行っています。

※サンプルソース実行時の注意事項

 PDF for .NETを使って作成したアプリケーションを配布する場合、アセンブリファイルを添付する必要があります。アプリケーションを正常に動作させるためには、次のファイルをインストールしてください。

必要なアセンブリファイル(※は.NET Framework 4でのみ使用可能)
ファイル 内容
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...」のものを選択し、設定してください。

参照を設定するDLL(※は.NET Framework 4でのみ使用可能)
ファイル名 説明
C1.C1Zip.2.dll 本体アセンブリ
C1.C1Zip.4.dll 本体アセンブリ(※)
C1.C1Zip.4.Design.dll デザイナアセンブリ(※)
コンポーネント名が「ComponentOne C1Zip JPN」で、バージョンが「4.1.2010...」の参照を追加
コンポーネント名が「ComponentOne C1Zip JPN」で、バージョンが「4.1.2010...」の参照を追加

C1Zipコントロールについて

 C1Zipコントロールは、Zip形式の圧縮・展開を可能にするC1ZipFileC1ZipEntry
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プロパティの値を書き出します。

Visual Basic
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
C#
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ファイルに一度に保存してしまいます。

Visual Basic
'ZIPエントリを追加
zipFile.Entries.Add(memstr, "sample.txt")
MessageBox.Show("圧縮ファイルに保存しました", "圧縮の実行", MessageBoxButtons.OK, MessageBoxIcon.Information)

'ストリームを閉じる
memstr.Close()
C#
//ZIPエントリを追加
zipFile.Entries.Add(memstr, "sample.txt");
MessageBox.Show("圧縮ファイルに保存しました", "圧縮の実行", MessageBoxButtons.OK, MessageBoxIcon.Information);

//ストリームを閉じる
memstr.Close();
テキストファイル「sample.txt」とZipファイル「myzipdata.zip」の2つのファイルが作成される
テキストファイル「sample.txt」とZipファイル「myzipdata.zip」の2つのファイルが作成される

Zipファイルから直接データを読み込む処理

 Zipファイルから直接データを読み出す処理を作成します。通常は、一度Zipファイルを解凍して中のファイルを取り出しそれからデータにアクセスしますが、C1ZipコントロールではZipファイルの中身に直接アクセスできます。

 アクセスの順序は、最初にZipファイルをOpenメソッドで開き、アクセスしたいファイルをエントリに指定してストリームに接続し、StreamReaderクラスのReadToEndメソッドでデータをバッファに読み出します。

Visual Basic
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
C#
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コンポーネントは、テキストデータだけでなく、バイナリデータやシリアル化されたデータ、データベースファイルなども圧縮ファイルとして保存できます。ディスクとの読み書きだけでなく、ストリームに対してもデータの圧縮・展開が行えますので、アプリケーションのメモリ上でのデータ処理でも威力を発揮することができるでしょう。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6381 2012/01/25 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング