プログラム

C#プログラミングレッスン

C#での .NETプログラミングを易しく丁寧に解説するメールマガジンです。「C#プログラミング・レッスン」で、.NETプログラミングをマスターしましょう。

全て表示する >

【C#プログラミングレッスン】 No.119-GZipStream

2007/02/27

┏━┳━━━━━━━━━━━━━━━━━━━━━━━━━┳━┳━┳━┓
┃☆┃ C#プログラミングレッスン                         ┃_┃□┃×┃
┣━┻━━━━━━━━━━━━━━━━━━━━━━━━━┻━┻━┻━┫
┃ファイルの圧縮  GZipStream                                  No.119┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

GZipStreamクラスは、.NET Framework2.0で新たに追加されたクラスです。
今回は、このクラスの使い方を説明します。
GZipStream には、ストリームの圧縮および圧縮解除を行う機能が提供されてい
ます。ストリームに対する操作を行うものなので、アーカイブ形式の ZIP ファ
イルを作成してくれるわけではありません。

■──────────────────────────────────
■ 圧縮を行う

圧縮を行う基本的なコードは以下の通りです。

 using System.IO.Compression;
  ...

 GZipStream  zipStream = new GZipStream(outputStream, 
                        CompressionMode.Compress, false);
  zipStream.Write(buffer, 0, buffer.Length);
  zipStream.Close();

まずは、コンストラクタ GZipStreamのインスタンスを作成します。

  第1引数  圧縮後のストリームを指定します。ファイルの場合には、
        事前にファイルストリームをオープンしておきます。

    第2引数  圧縮する場合は、CompressionMode.Compressを指定します。

  第3引数  ストリームを開いたままにしておく場合は true。それ以外の
              場合は falseです。ファイルに出力する場合は、falseで良い
              でしょう。

次に、Write メソッドで buffer (byte 配列のデータ)の内容を、圧縮ストリー
ムに書き出します。
最後に、Closeして終了。

では、ファイルを圧縮するコードを示します。

using System.IO.Compression;
...

static void CompressFile(string file) {
    FileStream inputFile = new FileStream(file, FileMode.Open,
                               FileAccess.Read, FileShare.Read);
    byte[] buffer = new byte[inputFile.Length];
    int count = inputFile.Read(buffer, 0, buffer.Length);
    inputFile.Close();

    Stream outputStream = new FileStream(file + ".gz", 
                FileMode.Create);

    GZipStream  zipStream = new GZipStream(outputStream, 
                CompressionMode.Compress, false);
    zipStream.Write(buffer, 0, buffer.Length);
    zipStream.Close();
}

このメソッドは、引数で与えられたファイルを .gz という拡張子のファイル
に圧縮します。
ここで作成された圧縮ファイルは、.gz 形式に対応したファイル解凍ソフトな
らば、もとのファイルに戻すことが可能です。


■──────────────────────────────────
■ 圧縮復元を行う

引き続き、圧縮復元のコードも見てみましょう。基本形を示します。

   using System.IO.Compression;
    ...

    GZipStream zipStream = new GZipStream(inputStream,
                                 CompressionMode.Decompress,false);
    byte[] buffer = new byte[1024];
    while ( true ) {
        int bytesRead = zipStream.Read(buffer, 0, 1024);
        if ( bytesRead == 0 )
            break;
        ...
    }
    zipStream.Close();

GZipStreamのインスタンスを生成する際に、圧縮されたストリームと
CompressionMode.Decompress を指定します。
Readメソッドで読み込むと、圧縮が解除された元のデータが取得できます。

では、圧縮されたファイル (.gz) を読み込んで、圧縮解除し、オリジナルのフ
ァイルを復元するコードを示します。

 using System.IO.Compression;
 ...

 static void DecompressFile(string file) {
     FileStream inputFile = new FileStream(file,
                            FileMode.Open, FileAccess.Read,
                            FileShare.Read);
     string outfilename = Path.Combine(
                            Path.GetDirectoryName(file), 
                       Path.GetFileNameWithoutExtension(file));
     FileStream outStream = new FileStream(outfilename, 
              FileMode.Create);
     GZipStream zipStream = new GZipStream(inputFile,
              CompressionMode.Decompress,false);
     byte[] buffer = new byte[1024];
     while ( true ) {
         int bytesRead = zipStream.Read(buffer, 0, 1024);
         if ( bytesRead == 0 ) 
             break;
         outStream.Write(buffer,0,bytesRead); 
     }
     zipStream.Close();
     outStream.Close();
 }


※ 拡張子(.gz) を取り除いたファイル名をPathクラスを使って求めています。

なお、GZipStream クラスは、サイズが 4 GB を超えるファイルの圧縮には使用
できません。


┌─┬─────────────────────────┬─┬─┬─┐
│☆│ C#プログラミングレッスン  (ぼぼ週刊)            │_│□│×│
├─┴─────────────────────────┴─┴─┴─┤
│ Published by Gushwell.                                           │
│ Copyright (C) 2004-2007 Gushwell All rights reserved.            │
│ Microsoft MVP Visual Developer - Visual C#(Apr 2006 - Mar 2007)  │
│-------------------- Gushwell's Page ---------------------------- │
│ 窓際プログラマーの独り言  :http://blog.livedoor.jp/gushwell/    │
│ 窓際プログラマーの読書三昧:http://gushwell.jugem.jp/            │
│ C#デザインパターン :                                             │
│  『増補改訂版Java言語で学ぶデザインパターン入門 / 結城 浩(著)』  │
│   のサンプルコードをC#に移植したものを掲載しています。           │
│   移植後のコードの公開は、結城氏の了解を得ています。             │
│   http://blog.livedoor.jp/gushwell/archives/50333227.html        │
└─────────────────────────────────┘

規約に同意してこのメルマガに登録/解除する

メルマガ情報

創刊日:2004-08-12  
最終発行日:  
発行周期:ほぼ週刊  
Score!: 非表示   

コメント一覧コメントを書く

この記事にコメントを書く

上の画像で表示されている文字を半角英数で入力してください。

※コメントの内容はこのページに公開されます。発行者さんだけが閲覧できるものではありません。 コメントの投稿時は投稿者規約への同意が必要です。

  • コメントはありません。