| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | 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);            }        }        }}
 |