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