[C#] Zipの圧縮ファイルを解凍するコードを作成する方法


Devlopment note / C#    作成日付 : 2020/04/07 11:17:44   修正日付 : 2020/04/07 11:22:01

こんにちは。明月です。


この投稿はC#でZipの圧縮ファイルを解凍するコードを作成する方法に関する説明です。


以前、C#でファイルをZipアルゴリズムで圧縮するソースコードに関して説明したことがあります。

link - [C#] Zip圧縮コードを作成する方法


その投稿にも説明しましたが、Zipアルゴリズムは様々なところでよく使うアルゴリズムです。Ionicライブラリと.Net frameworkを利用して圧縮する方法に関して説明しましたが、解凍も同じで作成しましょう。

Ionicライブラリ

Ionicライブラリは外部ライブラリなのでNugetを通ってIonicライブラリをダウンロードと連結をしましょう。




using System;
using System.IO;
using Ionic.Zip;
namespace CS_ZipExtractSource
{
  class Program
  {
    // 解凍する関数
    public static void ExtractZipByIonic(string zipPath, string destinationPath)
    {
      // 解凍するディレクトリが存在するかを確認する。
      if (!Directory.Exists(destinationPath))
      {
        // ディレクトリがなければ作成する。
        Directory.CreateDirectory(destinationPath);
      }
      // zipファイルを読み込む。
      using (var zip = new ZipFile(zipPath))
      {
        // 解凍する。 
        zip.ExtractAll(destinationPath);
      }
    }
    // 実行関数
    static void Main(string[] args)
    {
      // D:\work\ExtractTest\target.zipファイルをD:\work\ExtractTest\Ionicに解凍する。
      ExtractZipByIonic(@"D:\work\ExtractTest\target.zip", @"D:\work\ExtractTest\Ionic");
      Console.WriteLine("Press any key...");
      Console.ReadKey();
    }
  }
}

zipファイルの状況は下記のイメージになっています。


解凍しましょう。


実行しました。


解凍されました。

.Net Framework内部を利用する方法

先に「System.IO.Commpress」と「System.IO.Comppression.FileSystem」を追加しましょう。



using System;
using System.IO;
using System.IO.Compression;
namespace CS_ZipExtractSource
{
  class Program
  {
    // 解凍する関数
    public static void ExtractZipByIO(string zipPath, string destinationPath)
    {
      // 解凍するディレクトリが存在するかを確認する。
      if (!Directory.Exists(destinationPath))
      {
        // ディレクトリがなければ作成する。
        Directory.CreateDirectory(destinationPath);
      }
      // zipファイルを読み込む。
      using (ZipArchive zip = ZipFile.OpenRead(zipPath))
      {
        // Zipファイルの中でファイルを読み込む。
        foreach (ZipArchiveEntry entry in zip.Entries)
        {
          // 解凍するファイルを設定する。
          var filepath = Path.Combine(destinationPath, entry.FullName);
          // ディレクトリを取得
          var subDir = Path.GetDirectoryName(filepath);
          // ディレクトリがあるかを確認する。
          if (!Directory.Exists(subDir))
          {
            // ディレクトリを作成する。
            Directory.CreateDirectory(subDir);
          }
          // entryにディレクトリがある場合は「Name」がありません。
          if (String.IsNullOrEmpty(entry.Name))
          {
            // ディレクトリの場合は飛び越え。
            continue;
          }
          // ファイルを解凍する。 
          entry.ExtractToFile(filepath);
        }
      }
    }
    // 実行関数
    static void Main(string[] args)
    {
      // D:\work\ExtractTest\target.zipファイルをD:\work\ExtractTest\IOに解凍する。
      ExtractZipByIO(@"D:\work\ExtractTest\target.zip", @"D:\work\ExtractTest\IO");
      Console.WriteLine("Press any key...");
      Console.ReadKey();
    }
  }
}

zipファイルの状況は下記のイメージになっています。


解凍しましょう。


実行しました。


Ionicと.Net frameworkにあるライブラリで圧縮することと違ってソースの差異があります。Ionicの場合は圧縮のファイルを読み込んで解凍することではなく、ExtractAllの関数を呼び出しで一括で解凍されます。

標準ライブラリの場合は一つ一つの圧縮ファイルを読み込んでIOで作成することです。

個人的に解凍の場合は標準ライブラリがよいと思います。一つ一つのエラー確認やソース応用が可能することを比べてIonicの場合は解凍ソースはすごく簡単だけど、一つのコントロールが難しいなので様々ところで使いにくいと思います。


ここまでC#でZipの圧縮ファイルを解凍するコードを作成する方法に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

最新投稿