GZipStream クラス

Last Updated 2011/09/21


.NET Framework 2.0 に、GZipStream クラスが追加されました。このページではこのクラスの使い方について解説します。

ただし、GZipStream クラスを使って圧縮したファイルの形式は、一般的に普及している ZIP 形式とは異なります。しかし、幸いにして、一般的な ZIP 形式に圧縮するライブラリが公開されています。「ZIP ファイル」をご覧ください。


GZipStream クラスは .NET Framework 2.0 に追加されたクラスで、名前から想像できるように、ZIP 形式でファイルを圧縮するクラスです。ただし、ZIP 形式といっても通常流通しているそれとは異なります。"G" は  UNIX 系のシステムでおなじみの GNU を意味していますが、GNU の語源には諸説あって今では由来が分からなくなっているそうです。私が知る範囲で言えば、ソフトウエアは無料にするという UNIX 系ネットワークの世界の精神をさしているものと思います。

Note UNIX 系ネットワークはインターネットの出発点になったものですが、その当時は大学間の学術論文などの検索・流通などを目的として開発されたものだそうです。したがって、そこで流通するソフトエアウは無料にすることが大原則であったということでしょう。15 年ほど前のパソコン通信の初期の時代にも、ソフトウエアは無料にすべきという意見は多くありました。

さて、GZipStream クラスを使って圧縮したファイルの拡張子に .zip をつけて手持ちの解凍ソフトで解凍を試みると、私が使っているソフト(フリーウエアの eo)では解凍できました。ただし、解凍後のファイルの拡張子が .gnuzipped となり、通常の ZIP 形式ではないことを暗示しています。そこで、試しに、圧縮ファイルの拡張子を .gz にすると何の問題もなく、解凍できました。

以上のことから考察すると、GZipStream クラスは UNIX 系システムで広く使われている .gz 形式であると考えていいと思います。ただし、完全な互換性があるのかどうかはテストしていません。

Note UNIX 系システムで使っている .gz 形式のファイルとの互換性があるかどうかをテストできる環境をお持ちの方はぜひご一報をお願いします。私は UNIX 系マシーンを持っていないものですから。

GZipStream クラスの使い方の例として、ビットマップを圧縮し、また解凍するコードを以下に示します。ビットマップでなくても、テキストファイルでも同じ手順です。

なお、複数のファイルを圧縮・解凍するクラスを作ってみました。Compo のページにあります。

 using System.IO;
 using System.IO.Compression;

 // ビットマップファイルを圧縮する
 private void button1_Click(object sender, EventArgs e)
 {
    string fileName = "test.bmp";
    FileStream stream;

    // 圧縮すべきファイルに対するストリームオブジェクトを作成する
    stream = new FileStream(fileName, FileMode.Open);

    byte[] buffer = new byte[stream.Length];

    // 圧縮するデータを読み込む
    stream.Read(buffer, 0, (int)stream.Length);
    stream.Close();

    // 圧縮済みのデータを保存するファイルに対する FileStream オブジェクトを作成する
    stream = new FileStream(fileName + ".gz", FileMode.Create);

    // GZipStream オブジェクトを作成する
    GZipStream gzipStream = new GZipStream(stream, CompressionMode.Compress);

    // データを読み込んで圧縮しながらストリームに書き出す
    gzipStream.Write(buffer, 0, buffer.Length);

    // オブジェクトを開放する
    gzipStream.Close();
    stream.Close();
 }

 // button1_Click で作成した圧縮ファイルを解凍する
 private void button2_Click(object sender, EventArgs e)
 {
   int b;
   string fileName = "test.bmp.gz";

   FileStream inStream   = new FileStream(fileName, FileMode.Open);
   FileStream outStream  = new FileStream("test2.bmp", FileMode.Create);
   GZipStream gzipStream = new GZipStream(inStream, CompressionMode.Decompress);

   // 解凍しながらストリームに出力する
   while (true)
   {
     b = gzipStream.ReadByte();
     if (b == -1)
       break;

     outStream.WriteByte((byte)b);
   }

   gzipStream.Close();
   inStream.Close();
   outStream.Close();
 }

−以上−