指定したディレクトリの中身をまとめて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引数以降を持つオーバーロードメソッドを使用する必要があります。
