ZipFile.CreateFromDirectoryが使いにくいので1ファイルずつ判断しながらアーカイブ化していく。
※使いにくい:圧縮対象ディレクトリ内に圧縮ファイルを出力しようとすると例外が出る
※空ディレクトリ判定に時間がかかるのが課題
using System.IO.Compression; public static class ZipFileWrapper { public static void Compress(string srcDir, string outFile) { using var ms = new MemoryStream(); using (var ar = new ZipArchive(ms, ZipArchiveMode.Create, true)) { var di = new DirectoryInfo(srcDir); var entries = di.EnumerateFileSystemInfos("*", SearchOption.AllDirectories); foreach (var entry in entries) { if (entry is FileInfo) { var entryName = entry.FullName.Replace(srcDir, "").TrimStart('\\'); var zipEntry = ar.CreateEntry(entryName); using var zipStream = zipEntry.Open(); using var fs = new FileStream(entry.FullName, FileMode.Open, FileAccess.Read); fs.CopyTo(zipStream); } if (entry is DirectoryInfo d) { if (!d.EnumerateFileSystemInfos("*", SearchOption.AllDirectories).Any()) { // for empty directory var entryName = entry.FullName.Replace(srcDir, "").TrimStart('\\') + "\\"; ar.CreateEntry(entryName); } } } } File.WriteAllBytes(outFile, ms.ToArray()); } }