gzipで圧縮をする - C#

C#でgzip圧縮をするコードを紹介します。

概要

C#でgzip圧縮をする場合は、System.IO.Compression 名前空間の GZipStream クラスを利用します。

UI

以下のUIを作成します。ボタン、テキストボックス(複数行)、OpneFileDialog を配置します。

コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Compression;

namespace GZipCompress
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
        byte[] buffer = new byte[4096];
 
        FileStream inStream = new FileStream(openFileDialog1.FileName, 
          FileMode.Open, FileAccess.Read);
        FileStream outStream = new FileStream(openFileDialog1.FileName+".gz", 
          FileMode.Create, FileAccess.Write);

        GZipStream gzStream = new GZipStream(outStream,CompressionMode.Compress);

        int size=0;
        while ((size = inStream.Read(buffer, 0, buffer.Length)) >0){
          gzStream.Write(buffer,0,size);
        }

        inStream.Close();
        gzStream.Close();
        outStream.Close();

        textBox1.Text = "処理が終了しました。\r\n";
      }
    }
  }
}

解説

ボタンをクリックするとファイルを開くダイアログを表示し、ファイルが選択された場合に処理を実行します。

下記のコードでファイルからのデータを読み取るバッファを作成し、ファイル読み込み用のファイルストリームとファイル書き出し用のファイルストリームを作成します。
  byte[] buffer = new byte[4096];
 
  FileStream inStream = new FileStream(openFileDialog1.FileName, 
    FileMode.Open, FileAccess.Read);
  FileStream outStream = new FileStream(openFileDialog1.FileName+".gz", 
    FileMode.Create, FileAccess.Write);

GZipStreamを作成します。ファイル圧縮時はファイルの書き込み時に圧縮をするため、コンストラクタの第一引数には出力のファイルストリームオブジェクトを与えます。第二引数には圧縮モードを設定します。今回は圧縮のため"CompressionMode.Compress"を与えます。
  GZipStream gzStream = new GZipStream(outStream,CompressionMode.Compress);

  int size=0;
  while ((size = inStream.Read(buffer, 0, buffer.Length)) >0){
    gzStream.Write(buffer,0,size);
  }

入力用のストリームからファイルのデータを読み込み、GZipStreamを用いて書き出すことでデータを圧縮します。
ファイル末尾まで繰り返し、ファイルすべてを圧縮後、ストリームをクローズします。
  int size=0;
  while ((size = inStream.Read(buffer, 0, buffer.Length)) >0){
    gzStream.Write(buffer,0,size);
  }

  inStream.Close();
  gzStream.Close();
  outStream.Close();

  textBox1.Text = "処理が終了しました。\r\n";

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。ファイルを開くダイアログが表示されます。


圧縮するファイルを選択し開きます。


圧縮が始まります。処理が終了するとメッセージが表示されます。


圧縮したファイルのあるフォルダを確認します。圧縮したファイル名の末尾に".gz"が付いた圧縮ファイルが作成されました。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用

関連するページ

掲載日: 2013-08-01
iPentec all rights reserverd.