【C#】C#でZIPに圧縮・解凍を扱うには ~ サンプルコード編 ~

■ はじめに

C#でZIP圧縮・解凍をするサンプルプログラムを書く
* ZIPに関する記述は、以下を参照のこと
https://blogs.yahoo.co.jp/dk521123/20103286.html
* 以下は、かなり参考になったサイト
http://journal.mycom.co.jp/articles/2009/08/21/DotNetZip/001.html

■ 実装方法

準備

1. 以下のサイトから、DotNetZipをダウンロードする
http://dotnetzip.codeplex.com/
2. VisualStudioにおいて、[DotNetZip-v1.9]-[Release]-[Ionic.Zip.dll]を「参照の追加」を行う

■ サンプル

例1:ZIP圧縮をメソッド化

#region Zip圧縮処理
/// <summary>
/// Zipファイルを圧縮する
/// </summary>
/// <param name="path1">圧縮対象のディレクトリ</param>
/// <param name="path2">出力先のZIPファイルまでのパス</param>
/// <remarks>
/// [参考にしたWeb]
/// http://journal.mycom.co.jp/articles/2009/08/21/DotNetZip/index.html
/// </remarks>
private void CompressZip(string path1, string path2)
{
    using (ZipFile zip = new ZipFile(Encoding.GetEncoding("Shift_JIS")))
    {
        // 圧縮レベルを設定
        zip.CompressionLevel = CompressionLevel.BestCompression;

        // ファイルを追加
        zip.AddDirectory(path1);

        // ZIPファイルを保存
        zip.Save(path2);
    }
}
#endregion

例2:ZIP解凍をメソッド化

#region Zip解凍処理
/// <summary>
/// Zipファイルを解凍する
/// </summary>
/// <param name="sourcePath">解凍対象元のパス</param>
/// <param name="destPath">解凍先のパス(一時的に解凍するパス)</param>
private void UncompressZip(string sourcePath, string destPath)
{
    using (ZipFile zip = ZipFile.Read(
        sourcePath
        , Encoding.GetEncoding("Shift_JIS") // 日本語を使用している場合、Shift-JISを指定する
        ))
    {
        // 解凍処理
        zip.ExtractAll(destPath);
    }
}
#endregion

例3:ダイアログで指定したフォルダ内のZIPを全て解凍する

環境:VS2010
using System;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Ionic.Zip;

#region 「処理実行」ボタン押下後
/// <summary>
/// 「処理実行」ボタン押下後
/// </summary>
private void buttonRun_Click(object sender, EventArgs e)
{
    string selectPath = null;

    try
    {
         string selectPath = string.Empty;
         DialogResult result = this.folderBrowserDialog1.ShowDialog();

         if (result == DialogResult.OK)
         {

            if (Directory.Exists(this.folderBrowserDialog.SelectedPath))
            {
                selectPath = this.folderBrowserDialog.SelectedPath;
            }
            else
            {
                return;
            }
         }
         else
         {
             return;
         }
         
         if (!string.IsNullOrEmpty(selectPath))
         {
             // 提出モードの処理を実行する
             this.UnCompress(selectPath);
         }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
#endregion

#region 解凍処理
/// <summary>
/// 解凍処理を実行する
/// </summary>
/// <param name="path">ユーザが選択したフォルダまでのパス</param>
/// <param name="extention">解凍対象の拡張子(例:"*.gz")。デフォルトは"*.zip"</param>
private void UnCompress(string path, string extention = "*.zip")
{
    DirectoryInfo directoryInfo = new DirectoryInfo(path);
    string savePath = this.CreateFolder(directoryInfo);

    // ディレクトリ内にある解凍対象を解凍する
    foreach (FileInfo fileInfo in directoryInfo.GetFiles(extention))
    {
        this.UncompressZip(savePath, fileInfo);
    }
}
#endregion

#region Zip解凍処理
/// <summary>
/// Zipファイルを解凍する
/// </summary>
/// <param name="savePath">保存先のパス</param>
/// <param name="fileInfo">ユーザが指定したディレクトリ</param>
private void UncompressZip(string savePath, FileInfo fileInfo)
{
    
    using (FileStream inFile = fileInfo.OpenRead())
    {
        string currentFile = fileInfo.FullName;

        using (ZipFile zip = ZipFile.Read(currentFile
            , Encoding.GetEncoding("shift-jis") // 日本語を使用している場合、Shift-JISを指定する
            ))
        {
            foreach (ZipEntry e in zip)
            {
                // 解凍処理
                e.Extract(uncompressPath);
            }
        }
    }
}
#endregion

関連記事

Java

ZIP 処理 ~圧縮編~
https://blogs.yahoo.co.jp/dk521123/33497835.html
ZIP 処理 ~解凍編~
https://blogs.yahoo.co.jp/dk521123/33645352.html

C#

C#でZIPに圧縮・解凍について
https://blogs.yahoo.co.jp/dk521123/20103286.html