【C#】既存のZipファイルに新しいファイルを追加・追記する (ZipArchiveMode.Update)

既に作成済みのZIPファイルに対して、後から別のファイルを追加したり、既存のファイルを更新したりするには、ZipFile.Open メソッドで ZipArchiveMode.Update モードを指定して開きます。

このモードで開かれた ZipArchive オブジェクトに対して CreateEntryFromFile を実行することで、簡単にファイルを追加できます。

目次

実装サンプル:アーカイブへのファイル追加

以下のコードでは、既存の「Backup.zip」に対し、後から「Readme.txt」を追加する処理を行っています。

サンプルコード

using System;
using System.IO;
using System.IO.Compression; // 参照設定: System.IO.Compression.FileSystem が必要な場合あり

public class Program
{
    public static void Main()
    {
        // 1. テスト環境の準備
        // ベースとなるZIPファイルと、追加したいファイルを作成しておく
        string zipPath = "Backup.zip";
        string fileToAdd = "Readme.txt";

        // 空のZipファイルを作る(実演用)
        if (File.Exists(zipPath)) File.Delete(zipPath);
        using (ZipFile.Open(zipPath, ZipArchiveMode.Create)) { /* 空で作成 */ }

        // 追加するファイルを作る
        File.WriteAllText(fileToAdd, "これは追加されるファイルです。");


        Console.WriteLine($"処理前: {zipPath} を確認しました。");

        try
        {
            // 2. Zipファイルを「更新モード」で開く
            // ZipArchiveMode.Update: 読み取りと書き込みの両方が可能になります
            using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Update))
            {
                // 3. ファイルをアーカイブに追加する
                // CreateEntryFromFile(追加する実ファイル, Zip内でのファイル名)
                // ※第3引数に CompressionLevel を指定することも可能です
                archive.CreateEntryFromFile(fileToAdd, "Docs/Readme.txt");
                
                // ヒント: Streamを使って手動で書き込む場合は archive.CreateEntry() を使います
            }

            Console.WriteLine("ファイルの追加が完了しました。");

            // (確認) 中身を表示
            using (ZipArchive archive = ZipFile.OpenRead(zipPath))
            {
                Console.WriteLine("\n--- Zipファイルの中身 ---");
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    Console.WriteLine(entry.FullName);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("エラー: " + ex.Message);
        }
    }
}

実行結果

処理前: Backup.zip を確認しました。
ファイルの追加が完了しました。

--- Zipファイルの中身 ---
Docs/Readme.txt

解説と技術的なポイント

1. ZipArchiveMode.Update

ZipFile.Open の第2引数に渡すモードです。

  • Create: 新規作成(既存ファイルは上書き)。
  • Read: 読み取り専用。
  • Update: 既存の中身を維持したまま、エントリの追加や削除が可能です。

2. CreateEntryFromFile vs CreateEntry

  • CreateEntryFromFile: ディスク上にあるファイルを、1行のコードでZip内に追加します(推奨)。
  • CreateEntry: 空のエントリ(Zip内のファイル枠)を作成します。その後、entry.Open() でストリームを取得し、文字列やメモリ上のデータを書き込む場合に使用します。ユーザーコードにあった CopyTo を使う手法はこちらに該当しますが、単純なファイル追加なら CreateEntryFromFile の方が安全で簡単です。

3. Zip内での階層構造

CreateEntryFromFile の第2引数(entryName)に "Docs/Readme.txt" のようにスラッシュ区切りのパスを指定することで、Zipファイルの中にフォルダ階層を作ることができます。

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

この記事を書いた人

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

目次