using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Linq; using System.Text; using System.Threading.Tasks; using DocumentFormat.OpenXml.Vml.Office; namespace MECF.Framework.Common.Utilities { public static class ZIPUtil { public static async Task ZipAllExceptLogFolderAsync(string sourceFolder, string outputZipPath) { using (FileStream zipToOpen = new FileStream(outputZipPath, FileMode.Create)) { using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create)) { await CopyFilesAndDirectoriesAsync(sourceFolder, "", archive); } } } private static async Task CopyFilesAndDirectoriesAsync(string sourceDir, string parentEntryName, ZipArchive archive) { // Add an entry for the current directory if it's not empty or skipped if (!string.IsNullOrEmpty(parentEntryName) && !Directory.GetFiles(sourceDir).Any() && !Directory.GetDirectories(sourceDir).Any()) { string entryName = parentEntryName + "/"; archive.CreateEntry(entryName); } foreach (string file in Directory.GetFiles(sourceDir)) { string entryName = Path.Combine(parentEntryName, Path.GetFileName(file)); ZipArchiveEntry entry = archive.CreateEntry(entryName); using (Stream entryStream = entry.Open()) using (Stream fileStream = File.OpenRead(file)) { await fileStream.CopyToAsync(entryStream); } } foreach (string directory in Directory.GetDirectories(sourceDir)) { string dirName = Path.GetFileName(directory); if (dirName.Contains("Log") || dirName.Equals("ZIP", StringComparison.OrdinalIgnoreCase)) { continue; // Skip the Log and ZIP folders } string entryName = Path.Combine(parentEntryName, dirName); await CopyFilesAndDirectoriesAsync(directory, entryName, archive); } // Add an entry for the current directory if it contains only subdirectories if (!string.IsNullOrEmpty(parentEntryName) && !Directory.GetFiles(sourceDir).Any()) { string entryName = parentEntryName + "/"; archive.CreateEntry(entryName); } } } }