C#でZlibを用いる (ZlibのDeflate圧縮をする)

C#でZlibの圧縮(Deflateアルゴリズム)を用いる場合は、System.IO.CompressionのDeflateStreamクラスを用います。

説明

圧縮時

圧縮の際には

  • 読み込み用のストリーム
  • 書き出し用のストリーム
  • DeflateStream
の3つのストリームを用意します。
DeflateStreamのコンストラクタの引数には書き出し用のストリームを与えます。
読み出し用のストリームからバッファに読み込み、DeflateStreamのWriteメソッドを使って圧縮データを書き出します。この時の書き出し先がコンストラクタの引数で与えたストリームになります。この処理を読み出し用のストリームからの呼び出しサイズが0になるまで(ファイルやメモリの末尾に到達するまで)続けます。

解凍時

解凍の際にも

  • 読み込み用のストリーム
  • 書き出し用のストリーム
  • DeflateStream
の3つのストリームを用意します。
DeflateStreamのコンストラクタの引数には読み込み用のストリームを与えます。
DeflateStreamのReadメソッドを使い解凍されたデータをバッファに一定サイズずつ読み込みます。読み出し先はDeflateStramのコンストラクタに与えたストリームになります。バッファに読み込んだ内容を、書き出し用のストリームを使い出力ストリームへ書き出します。この処理をDeflateStreamのReadメソッドの読み込みサイズがーになるまで(ファイルやメモリの末尾に到達するまで)続けます。

コード例

以下のコードでファイルを圧縮します。

 DeflateCompress.exe -c (ファイル名)


以下のコードでファイルを解凍するプログラムの例です。

 DeflateCompress.exe -d (ファイル名)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.IO.Compression;

namespace DeflateCompress
{
  class Program
  {
    static void Main(string[] args)
    {
      string opt = args[0];
      opt = opt.Trim();
      string fname = args[1];
      fname = fname.Trim();
            
      if (opt == "-c") {
        FileStream fs = new FileStream(fname, FileMode.Open);

        FileStream fso = new FileStream(fname + ".deflate", FileMode.CreateNew);
        DeflateStream ds = new DeflateStream(fso, CompressionMode.Compress);
        
        byte[] data = new byte[512];

        while (true) {
          int rs = fs.Read(data, 0, data.Length);
          ds.Write(data, 0, rs);
          if (rs == 0) break;
        }

        fs.Close();
        ds.Close();
        fso.Close();
      }
      else if (opt == "-d") {
        FileStream fs = new FileStream(fname, FileMode.Open);
        DeflateStream ds = new DeflateStream(fs, CompressionMode.Decompress);

        FileStream fso = new FileStream(fname + ".decompress", FileMode.Create);

        byte[] data = new byte[512];
        while (true) {
          int rs = ds.Read(data, 0, data.Length);
          fso.Write(data, 0, rs);
          if (rs == 0) break;
        }
        fs.Close();
        ds.Close();
        fso.Close();
      
      }
    }
  }
}
AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2010-08-07
Copyright © 1995–2025 iPentec all rights reserverd.