gzipファイルを展開する - C#

gzipを展開するコードを紹介します。

概要

C#でgzipを展開する場合は、、System.IO.Compression 名前空間のGZipStreamを用います。

UI

以下のUIを作成します。

コード

下記のコードを記述します。
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;
using System.Text.RegularExpressions;


namespace GZipExtract
{
  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);
        GZipStream gzStream = new GZipStream(inStream, CompressionMode.Decompress);

        Regex reg = new Regex(@"\.gz$");
        string filename = reg.Replace(openFileDialog1.FileName, "");

        FileStream outStream = new FileStream(filename, FileMode.Create, FileAccess.Write);


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

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

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

解説

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

バッファを準備し、ファイルを読み込むためのストリームを作成します。また、圧縮されたファイルを読み込むためのGZipStreamを作成します。GZipの展開はファイルの読み込み時に実行するため、GZipStreamのコンストラクタの第一引数には読み込み用のストリームを与えます。第二引数には圧縮モードを与えます。今回はデータの展開のため"CompressionMode.Decompress"を指定します。
  byte[] buffer = new byte[4096];

  FileStream inStream = new FileStream(openFileDialog1.FileName, 
    FileMode.Open, FileAccess.Read);
  GZipStream gzStream = new GZipStream(inStream, CompressionMode.Decompress);

下記のコードはファイルを開くダイアログで開かれたファイル名から末尾の".gz"を削除するコードです。
  Regex reg = new Regex(@"\.gz$");
  string filename = reg.Replace(openFileDialog1.FileName, "");

ファイルを書き込むためのストリームを作成します。
  FileStream outStream = new FileStream(filename, FileMode.Create, FileAccess.Write);

GZipStreamのReadメソッドを呼び出し圧縮されたデータを読み出し展開します。展開されたデータは出力用のストリームで書き出します。
  int size = 0;
  while ((size = gzStream.Read(buffer, 0, buffer.Length)) > 0) {
    outStream.Write(buffer, 0, size);
  }

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

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

実行結果

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


[button1]をクリックします。ファイルを開くダイアログが表示されます。gzipで圧縮されているファイルを選択します。


ファイルが展開されます。処理が終了するとメッセージが表示されます。


圧縮ファイルが配置されているフォルダを確認します。".gz"の拡張子のない展開されたファイルが作成されました。


gzip圧縮されたファイルの展開ができました。

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

関連するページ

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