[C#][VB.NET] DotNetZip を使ってZIP圧縮を行う方法

[C#][VB.NET] DotNetZip を使ってZIP圧縮を行う方法

.NET で ZIPを扱う方法

.NET Framework 4.5以降だと標準ライブラリの ZipFileクラス を利用することで、Zipファイルを簡単に取り扱えます。

別の手段として、オープンソースのライブラリを利用する方法もあります。今回は DotNetZip というライブラリを使ってZIPの圧縮・解凍を行ってみます。

コンソールアプリやデスクトップアプリはもちろん、ASP.NETアプリ(Web)でも同じように扱えます。

ZIP圧縮を行う方法

まずはNuGetからライブラリをインストールします。上記URLから直接DLLをダウンロードして参照に追加してもよいです。

Install-Package DotNetZip

ではまずZIP化してみます。指定したパスのファイルを生成したZIPアーカイブに追加していきます。ファイルだけでなく、TextWriter(メモリ上のデータ) も追加できます。

C#

// using Ionic.Zip;
// using Ionic.Zlib;

// ZIPファイルの生成
using (var zip = new ZipFile(Encoding.GetEncoding("shift_jis")))
{
    // 圧縮レベル
    zip.CompressionLevel = CompressionLevel.BestCompression;

    // ファイルやディレクトリをZIPアーカイブに追加
    // 以下のような構成のZIPアーカイブとなる
    // hogefoo.zip
    //   --hoge.txt
    //   -- foo
    zip.AddFile(@"C:\work\hoge.txt", "");
    zip.AddDirectory(@"C:\work\foo", "foo");

    // 保存
    zip.Save(@"C:\work\hogefoo.zip");
}

VB.NET

' Imports Ionic.Zip
' Imports Ionic.Zlib

' ZIPファイルの生成
Using zip = New ZipFile(Encoding.GetEncoding("shift_jis"))
    ' 圧縮レベル
    zip.CompressionLevel = CompressionLevel.BestCompression

    ' ファイルやディレクトリをZIPアーカイブに追加
    ' 以下のような構成のZIPアーカイブとなる
    ' hogefoo.zip
    '   --hoge.txt
    '   -- foo
    zip.AddFile("C:\work\hoge.txt", "")
    zip.AddDirectory("C:\work\foo", "foo")

    ' 保存
    zip.Save("C:\work\hogefoo.zip")
End Using

日本語を使う場合には “shift_jis” にしないと文字化けするようです。

ZIP解凍を行う方法

次は解凍です。ZipFileクラスのコンストラクタに解凍する .zipファイルを指定し、”ExtraAll” メソッドを利用します。基本的には一括でのZIP解凍を行うことが多いと思いますが、個別に解凍することもできるようです。

C#

// ZIPファイルを指定
string input = @"C:\work\hogefoo.zip";
string output = @"C:\work\hogefoo";
using (var zip = new ZipFile(input, Encoding.GetEncoding("shift_jis")))
{
    // 一括で指定パスに解凍
    zip.ExtractAll(output);

    //// 全エントリーを走査して個別解凍
    //foreach (var entry in zip.Entries)
    //{
    //    entry.Extract();
    //}

    // 特定のファイルのみ解凍
    //zip["hoge.txt"].Extract("extra");
}

VB.NET

' ZIPファイルを指定
Dim input As String = "C:\work\zip\hogefoo.zip"
Dim output As String = "C:\work\zip\hogefoo"
Using zip = New ZipFile(input, Encoding.GetEncoding("shift_jis"))
    ' 一括で指定パスに解凍
    zip.ExtractAll(output)

    '' 全エントリーを走査して個別解凍
    'For Each entry As ZipEntry In zip.Entries
    '    entry.Extract()
    'Next

    '' 特定のファイルのみ解凍
    'zip("hoge.txt").Extract("extra")
End Using

まとめ

簡単に使えて便利なZIPライブラリでした。

C#カテゴリの最新記事