ZIPファイルを展開する (.NET Framework 4.5 以降)

C#で .NET Framework 4.5 以降でZipファイルを解凍するコードを紹介します。

概要

.NET Framework 4.5 以降ではZipArchive クラスを利用することで、外部のライブラリを利用せずに、ZIPファイルの解凍処理が実装できます。
この記事では、ZIPファイルを解凍するコードを紹介します。
補足
.NET Framework 4.5 以前では DotNetZip ライブラリを利用して展開処理を実装できます。詳細はこちらの記事を参照してください。

プログラム例1

Windows Formアプリケーションを作成します。

UI

下図のフォームを作成します。ボタンと複数行のテキストボックス、OpenFileDialog を配置します。
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像1

コード

下記のコードを記述します。button1のクリックイベントを実装します。
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 DotNetZipArchive
{
  public partial class FormZipExtract : Form
  {
    public FormZipExtract()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == DialogResult.OK) {
        Directory.CreateDirectory("extract");

        FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
        ZipArchive za = new ZipArchive(fs, ZipArchiveMode.Read);

        foreach (ZipArchiveEntry ze in za.Entries) {
          ze.ExtractToFile("extract\\" + ze.FullName);
          textBox1.Text += ze.FullName + "を展開しました\r\n";
        }
        za.Dispose();
        fs.Close();
      }
    }
  }
}

解説

OpenFileDialogを開き、展開するZIPファイルを選択します。
  if (openFileDialog1.ShowDialog() == DialogResult.OK) {
    //中略
  }

実行ファイルの配置パスに extract ディレクトリを作成します。
    Directory.CreateDirectory("extract");

選択したZipファイルのFileStreamを作成します。
作成したFileStreamから ZipArchive オブジェクトを作成します。
    FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
    ZipArchive za = new ZipArchive(fs, ZipArchiveMode.Read);

ZipArchive オブジェクトの Entries プロパティを参照してZipファイル内に圧縮されているファイルの一覧を取得できます。
ファイルの展開は、EntriesプロパティのZipArchiveEntry オブジェクトの ExtractToFile メソッドを呼び出してファイルを展開します。
foreach ループを利用してZipファイル内の圧縮ファイルをすべて展開します。
    foreach (ZipArchiveEntry ze in za.Entries) {
      ze.ExtractToFile("extract\\" + ze.FullName);
      textBox1.Text += ze.FullName + "を展開しました\r\n";
    }

処理が終わったら、ZipArchive オブジェクトのDisposeメソッドを呼び出し、 FileStreamオブジェクトのCloseメソッドを呼び出し、オブジェクトを開放します。
    za.Dispose();
    fs.Close();

補足

usingを利用した場合や例外処理を利用したコードは下記になります。
usingを利用した場合
  private void button2_Click(object sender, EventArgs e)
  {
    if (openFileDialog1.ShowDialog() == DialogResult.OK) {
      Directory.CreateDirectory("extract");

      using (FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open)) {
        using (ZipArchive za = new ZipArchive(fs, ZipArchiveMode.Read)) {
          foreach (ZipArchiveEntry ze in za.Entries) {
            ze.ExtractToFile("extract\\" + ze.FullName);
            textBox1.Text += ze.FullName + "を展開しました\r\n";
          }
        }
      }
    }
  }
tryを利用した場合
  private void button2_Click(object sender, EventArgs e)
  {
    if (openFileDialog1.ShowDialog() == DialogResult.OK) {
      Directory.CreateDirectory("extract");

      FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
      try {
        ZipArchive za = new ZipArchive(fs, ZipArchiveMode.Read);
        try {
          foreach (ZipArchiveEntry ze in za.Entries) {
            ze.ExtractToFile("extract\\" + ze.FullName);
            textBox1.Text += ze.FullName + "を展開しました\r\n";
          }
        }
        finally {
          za.Dispose();
        }
      }
      finally {
        fs.Close();
      }
    }
  }

実行結果

上記のプロジェクトを実行します。下図のウィンドウが表示されます。
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像2

[button1]を苦リクします。ファイルを開くダイアログが表示されます。展開するZIPファイルを選択します。
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像3

ZIPファイルを選択するとファイルの展開が始まります。
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像4

実行ファイルのディレクトリを表示します。ディレクトリ内に "extract" ディレクトリが作成されます。
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像5

"extract"ディレクトリ内に選択したZIPファイルの内容が展開されています。
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像6

展開されたファイルを開いて内容を確認します。ファイルが展開できていることが確認できます。
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像7

Zipファイルの展開処理を実装できました。

プログラム例2: すべてのファイルを展開する場合

すべてのファイルを指定したディレクトリに展開する場合は、ZipFileクラスのExtractToDirectoryメソッドを利用します。

UI

下図のフォームを作成します。(button3を利用します。)
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像8

コード

下記のコードを記述します。
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 DotNetZipArchive
{
  public partial class FormZipExtract : Form
  {
    public FormZipExtract()
    {
      InitializeComponent();
    }

    private void button3_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == DialogResult.OK) {
        ZipFile.ExtractToDirectory(openFileDialog1.FileName, "c:\\zip-extract");
      }
    }
  }
}

解説

FileOpenDialogを開き展開するZIPファイルを選択します。ファイルが選択された場合は、ZipFile.ExtractToDirectory() メソッドを呼び出しZIPファイルを展開します。
ExtractToDirectoryの第一引数に展開するZIPファイルのパスを与えます。第二引数にZipファイルを展開先のディレクトリのパスを与えます。
  if (openFileDialog1.ShowDialog() == DialogResult.OK) {
    ZipFile.ExtractToDirectory(openFileDialog1.FileName, "c:\\zip-extract");
  }

実行結果

上記のプロジェクトを実行します。下図のウィンドウが表示されます。
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像9

[button3]をクリックします。ファイルを開くダイアログが表示されます展開するZIPファイルを選択します。
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像10

展開処理が実行されますが、画面上での変化はありません。
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像11

エクスプローラーで C:\zip-extract ディレクトリを確認します。選択したZIPファイルがディレクトリに展開されています。
 ZIPファイルを展開する (.NET Framework 4.5 以降):画像12

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2021-02-28
Copyright © 1995–2025 iPentec all rights reserverd.