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


Devlopment note / C#    作成日付 : 2020/04/06 14:56:13   修正日付 : 2020/04/06 14:57:21

こんにちは。明月です。


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


Zip圧縮アルゴリズムは私の考えて世界の中で一番よく使う圧縮アルゴリズムではないかと思います。アルゴリズムの優秀性もいいけれども、Zip圧縮アルゴリズムに関して多いライブラリがあり、接近性と便利性がよいからよく使うと思います。

C#の.Net Framework内部でもZipアルゴリズムがあります。

そのため、.Net Frameworkのソースをを利用して圧縮する方法と、Ionicライブラリを利用して圧縮する方法があります。

二つのライブラリでパフォーマンスの差がありません。ソースのステップの差もないので、ユーザが気になるもので使えばよいです。

Ionicライブラリ

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




using System;
using System.Collections.Generic;
using System.IO;
using Ionic.Zip;
namespace CS_ZipCompressSource
{
  class Program
  {
    // ファイルリストを取得する関数 (再帰を通ってSubディレクトリのファイルもすべて取得する。)
    public static List<String> GetFileList(String rootPath, List<String> fileList = null)
    {
      // ファイルリストを格納するリストがNULLなら返却
      if (fileList == null)
      {
        fileList = new List<string>();
      }
      // fileのパスの属性を取得する。
      var attr = File.GetAttributes(rootPath);
      // ディレクトリの場合
      if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
      {
        // ディレクトリ情報を取得する。
        var dirInfo = new DirectoryInfo(rootPath);
        // ディレクトリリストを取得する。
        foreach (var dir in dirInfo.GetDirectories())
        {
          // 再帰要請でサブディレクトリを探索する。
          GetFileList(dir.FullName, fileList);
        }
        // ファイルリストを取得する。
        foreach (var file in dirInfo.GetFiles())
        {
          // 再帰要請でファイルを検索する。 
          GetFileList(file.FullName, fileList);
        }
      }
      // ファイルの場合
      else
      {
        // ファイル情報を取得する。
        var fileInfo = new FileInfo(rootPath);
        // リストの絶対パスを格納する。
        fileList.Add(fileInfo.FullName);
      }
      return fileList;
    }
    // 圧縮実行関数
    public static void CompressZipByIonic(string sourcePath, string zipPath)
    {
      // sourcePathのパラメータからディレクトリを取得する。
      var filelist = GetFileList(sourcePath);
      // ファイルのリストで圧縮を開始する。
      using (var zip = new ZipFile())
      {
        // ファイルのリストを繰り返す。
        foreach (string file in filelist)
        {
          // 絶対パスで相対パスに変更。
          string path = file.Substring(sourcePath.Length + 1);
          // zipオブジェクトでファイルを追加する。
          zip.AddEntry(path, File.ReadAllBytes(file));
        }
        // ファイル格納
        zip.Save(zipPath);
      }
    }
    // 実行関数
    static void Main(string[] args)
    {
      // D:\work\CompressTestのディレクトリを圧縮してD:\work\CompressTest\Ionic.zipのファイルで作成する。
      CompressZipByIonic(@"D:\work\CompressTest", @"D:\work\CompressTest\Ionic.zip");
      Console.WriteLine("Press any key...");
      Console.ReadKey();
    }
  }
}



D:\work\CompressTestのディレクトリを圧縮しましょう。


実行しました。


圧縮ファイルが作成されたことを確認できます。

圧縮ファイル内を確認しましょう。



圧縮が正常にできました。

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

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



using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
namespace CS_ZipCompressSource
{
  class Program
  {
    // ファイルリストを取得する関数 (再帰を通ってSubディレクトリのファイルもすべて取得する。)
    public static List<String> GetFileList(String rootPath, List<String> fileList = null)
    {
      // ファイルリストを格納するリストがNULLなら返却
      if (fileList == null)
      {
        fileList = new List<string>();
      }
      // fileのパスの属性を取得する。
      var attr = File.GetAttributes(rootPath);
      // ディレクトリの場合
      if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
      {
        // ディレクトリ情報を取得する。
        var dirInfo = new DirectoryInfo(rootPath);
        // ディレクトリリストを取得する。
        foreach (var dir in dirInfo.GetDirectories())
        {
          // 再帰要請でサブディレクトリを探索する。
          GetFileList(dir.FullName, fileList);
        }
        // ファイルリストを取得する。
        foreach (var file in dirInfo.GetFiles())
        {
          // 再帰要請でファイルを検索する。 
          GetFileList(file.FullName, fileList);
        }
      }
      // ファイルの場合
      else
      {
        // ファイル情報を取得する。
        var fileInfo = new FileInfo(rootPath);
        // リストの絶対パスを格納する。
        fileList.Add(fileInfo.FullName);
      }
      return fileList;
    }
    // 圧縮実行関数
    public static void CompressZipByIO(string sourcePath, string zipPath)
    {
      // sourcePathのパラメータからディレクトリを取得する。
      var filelist = GetFileList(sourcePath, new List<String>());
      // ファイルを生成するようにストリームを取得する。
      using (FileStream fileStream = new FileStream(zipPath, FileMode.Create, FileAccess.ReadWrite))
      {
        // 圧縮ファイルを生成する。
        using (ZipArchive zipArchive = new ZipArchive(fileStream, ZipArchiveMode.Create))
        {
          // ファイルのリストを繰り返す。
          foreach (string file in filelist)
          {
            // 絶対パスで相対パスに変更。
            string path = file.Substring(sourcePath.Length + 1);
            // zipオブジェクトでファイルを追加する。   
            zipArchive.CreateEntryFromFile(file, path);
          }
        }
      }
    }
    static void Main(string[] args)
    {
      CompressZipByIO(@"D:\work\CompressTest", @"D:\work\CompressTest\IO.zip");
      Console.WriteLine("Press any key...");
      Console.ReadKey();
    }
  }
}



D:\work\CompressTestのディレクトリを圧縮しましょう。


実行しました。


圧縮ファイルが作成されたことを確認できます。

圧縮ファイル内を確認しましょう。



Ionicライブラリと標準ライブラリを利用するソーススタイルが似てます。圧縮解凍は少し差がありますが、圧縮することは同じです。

そうすると標準ライブラリを使うほうがオープンライブラリを利用することより良いと思います。


ここまでC#でZip圧縮コードを作成する方法に関する説明でした。


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

最新投稿