[C#][VB.NET] ZIP圧縮・解凍を行う方法

[C#][VB.NET] ZIP圧縮・解凍を行う方法

.NETでのZIPファイルの制御

C#あるいはVB.NETのプログラムから、ファイルのZIP圧縮・解凍を行う方法をまとめました。
調べてみると.NET Framework 4.5以降からZIPファイル制御用のクラスが追加されていました。

.NET Framework 4.0以前の環境では別の方法を用いる必要があります。
外部のライブラリやJ#ライブラリを使用する方法があるそうですが未確認です。

その他の案として、VBScriptでZIP圧縮をする方法があります。
このスクリプトをプログラムから呼び出せば、ZIP圧縮が可能です。

.NET Framework 4.5以降の場合

ZIPファイル制御のためのクラスが追加されているのでそれを使用します。まずは準備として、プロジェクトの参照に、System.IO.Compression.FileSystem.dllを追加しておきます。

System.IO.Compression.FileSystem.dllを参照に追加

あとは、名前空間(System.IO.Compression)をインポートすれば、ZIPファイルの圧縮・解凍を行える、ZipFileクラスを利用できます。

using System.IO.Compression;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 作成されるZIPファイル名
            string zipName = @"C:\work\test.zip";
            // ZIP圧縮するフォルダ名
            string folderName = @"C:\work\zipfolder";
            // ZIP解凍されたフォルダ名
            string extraName = @"C:\work\extra";

            // ZIP圧縮処理
            ZipFile.CreateFromDirectory(folderName, zipName);

            // ZIP解凍処理
            ZipFile.ExtractToDirectory(zipName, extraName);
        }
    }
}

上の例では、C:\work\zipfolder を C:\work\test.zip\test.zip というZIPファイルに圧縮しています。
またそのあと続けて作成したZIPファイルを解凍して、C:\work\extra としています。

それぞれ圧縮・解凍ができているか確認してください。
その他詳細な使用方法は以下のURLを参考にしてください。

MSDN – 方法 : ファイルを圧縮して抽出する

日本語を含むフォルダをZIP圧縮する場合の文字化け対策

上記手順で日本語を含むフォルダをZIP圧縮を行うと、解凍後のファイル名が文字化けしてしまいます。文字化けしないようにするには以下のように圧縮時のエンコードで Shift-JIS を指定してやる必要があります。

// ZIP圧縮処理
ZipFile.CreateFromDirectory(
    folderName, 
    zipName, 
    CompressionLevel.Optimal, 
    true, 
    Encoding.GetEncoding("sjis")
);

こうすることで文字化けせずに圧縮解凍が行えます。Windows環境だと文字コードの関係でよく文字化けします。

VBScriptでZIP圧縮を行う方法

この方法を用いればおそらく.NET Frameworkのバージョンに左右されることはないと思います。
なので、4.0以前のフレームワークでもこのVBScriptを呼び出せば、プログラムからZIPファイルの制御が可能です。
追加のDLLなども参照しないで済みます。

WindowsOSだと右クリックからZIPに圧縮という操作が可能です。
しかしWindowsではZIPファイルの制御を行う、コマンド(API)が用意されていません。
なのでShellオブジェクトを作成し、操作することで実現してやります。

具体的なコードは以下を参照してください。

InputFolder = "C:\work\zipfolder" 'ZIPに収録するファイルのあるディレクトリ名
ZipFile     = "C:\work\test.zip"  'ZIPファイル名

CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set objShell = CreateObject("Shell.Application")
Set source = objShell.NameSpace(InputFolder).Items
objShell.NameSpace(ZipFile).CopyHere(source)
wScript.Sleep 2000

このコードを拡張子.vbsで保存します。保存したファイルをダブルクリックで実行すれば、圧縮されZIPファイルが生成されます。

あとは上記コードを参考に、vbsファイルを作成しておき、プログラム側から引数とともに呼び出してやれば、動的な制御が可能になります。

参考URL

C#カテゴリの最新記事