既に作成済みの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ファイルの中にフォルダ階層を作ることができます。
