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

