C#で .NET Framework 4.5 以降でZipファイルを解凍するコードを紹介します。
.NET Framework 4.5 以降ではZipArchive クラスを利用することで、外部のライブラリを利用せずに、ZIPファイルの解凍処理が実装できます。
この記事では、ZIPファイルを解凍するコードを紹介します。
Windows Formアプリケーションを作成します。
下図のフォームを作成します。ボタンと複数行のテキストボックス、OpenFileDialog を配置します。
下記のコードを記述します。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を利用した場合や例外処理を利用したコードは下記になります。
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";
}
}
}
}
}
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();
}
}
}
上記のプロジェクトを実行します。下図のウィンドウが表示されます。
[button1]を苦リクします。ファイルを開くダイアログが表示されます。展開するZIPファイルを選択します。
ZIPファイルを選択するとファイルの展開が始まります。
実行ファイルのディレクトリを表示します。ディレクトリ内に "extract" ディレクトリが作成されます。
"extract"ディレクトリ内に選択したZIPファイルの内容が展開されています。
展開されたファイルを開いて内容を確認します。ファイルが展開できていることが確認できます。
Zipファイルの展開処理を実装できました。
すべてのファイルを指定したディレクトリに展開する場合は、ZipFile
クラスのExtractToDirectory
メソッドを利用します。
下図のフォームを作成します。(button3を利用します。)
下記のコードを記述します。
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");
}
上記のプロジェクトを実行します。下図のウィンドウが表示されます。
[button3]をクリックします。ファイルを開くダイアログが表示されます展開するZIPファイルを選択します。
展開処理が実行されますが、画面上での変化はありません。
エクスプローラーで C:\zip-extract
ディレクトリを確認します。選択したZIPファイルがディレクトリに展開されています。