【C#】ディレクトリ(フォルダ)をZIPファイルに圧縮する (ZipFile.CreateFromDirectory)

指定したディレクトリの中身をまとめて1つのZIPファイル(アーカイブ)にするには、System.IO.Compression.ZipFile クラスの CreateFromDirectory メソッドを使用するのが標準的です。

このメソッドを使うと、面倒なストリーム操作を記述することなく、1行のコードで圧縮処理が完了します。

目次

実装サンプル:ドキュメントフォルダのバックアップ

以下のコードでは、指定したフォルダ(MyDocuments)の中にダミーファイルを作成し、それをまるごと「MyDocuments_Backup.zip」という名前で圧縮保存しています。

サンプルコード

※ .NET Framework環境などでは、参照設定に System.IO.Compression.FileSystem の追加が必要な場合があります。

using System;
using System.IO;
using System.IO.Compression; // ZIP操作に必要

public class Program
{
    public static void Main()
    {
        // 圧縮したいフォルダ(ソース)
        string sourceDir = "MyDocuments";
        
        // 作成するZIPファイルのパス(出力先)
        string zipPath = "MyDocuments_Backup.zip";

        // 1. テスト環境の準備
        // フォルダとファイルを作成しておきます
        if (Directory.Exists(sourceDir)) Directory.Delete(sourceDir, recursive: true);
        if (File.Exists(zipPath)) File.Delete(zipPath);

        Directory.CreateDirectory(sourceDir);
        File.WriteAllText(Path.Combine(sourceDir, "memo.txt"), "会議メモです。");
        File.WriteAllText(Path.Combine(sourceDir, "budget.csv"), "100,200,300");

        try
        {
            Console.WriteLine($"フォルダ '{sourceDir}' を圧縮します...");

            // 2. フォルダをZIP圧縮する
            // ZipFile.CreateFromDirectory(圧縮元フォルダ, 出力先ファイルパス)
            ZipFile.CreateFromDirectory(sourceDir, zipPath);

            Console.WriteLine($"圧縮完了: {Path.GetFullPath(zipPath)}");
        }
        catch (IOException ex)
        {
            // 出力先に同名のZIPファイルが既に存在する場合などに発生します
            Console.WriteLine($"エラー: {ex.Message}");
        }
    }
}

実行結果

フォルダ 'MyDocuments' を圧縮します...
圧縮完了: C:\Work\MyDocuments_Backup.zip

解説と注意点

1. 必要な名前空間

この機能を使うには、using System.IO.Compression; が必要です。

2. 出力先のファイル重複

CreateFromDirectory は、出力先のZIPファイルが既に存在していると IOException をスローします。上書き機能はないため、確実に処理したい場合は、事前に File.Exists で確認して削除しておくか、ファイル名に日時をつけるなどの工夫が必要です。

3. 文字コードについて

現代の .NET (.NET Core以降 / .NET 5+) では、デフォルトで UTF-8 エンコーディングが使用されるため、日本語ファイル名が含まれていても基本的に文字化けしません。 Windows標準機能(エクスプローラー)との互換性を重視して Shift-JIS を強制したい場合は、第3引数以降を持つオーバーロードメソッドを使用する必要があります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次