ZIPUtil.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.IO.Compression;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using DocumentFormat.OpenXml.Vml.Office;
  9. namespace MECF.Framework.Common.Utilities
  10. {
  11. public static class ZIPUtil
  12. {
  13. public static async Task ZipAllExceptLogFolderAsync(string sourceFolder, string outputZipPath)
  14. {
  15. using (FileStream zipToOpen = new FileStream(outputZipPath, FileMode.Create))
  16. {
  17. using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
  18. {
  19. await CopyFilesAndDirectoriesAsync(sourceFolder, "", archive);
  20. }
  21. }
  22. }
  23. private static async Task CopyFilesAndDirectoriesAsync(string sourceDir, string parentEntryName, ZipArchive archive)
  24. {
  25. // Add an entry for the current directory if it's not empty or skipped
  26. if (!string.IsNullOrEmpty(parentEntryName) && !Directory.GetFiles(sourceDir).Any() && !Directory.GetDirectories(sourceDir).Any())
  27. {
  28. string entryName = parentEntryName + "/";
  29. archive.CreateEntry(entryName);
  30. }
  31. foreach (string file in Directory.GetFiles(sourceDir))
  32. {
  33. string entryName = Path.Combine(parentEntryName, Path.GetFileName(file));
  34. ZipArchiveEntry entry = archive.CreateEntry(entryName);
  35. using (Stream entryStream = entry.Open())
  36. using (Stream fileStream = File.OpenRead(file))
  37. {
  38. await fileStream.CopyToAsync(entryStream);
  39. }
  40. }
  41. foreach (string directory in Directory.GetDirectories(sourceDir))
  42. {
  43. string dirName = Path.GetFileName(directory);
  44. if (dirName.Contains("Log") || dirName.Equals("ZIP", StringComparison.OrdinalIgnoreCase))
  45. {
  46. continue; // Skip the Log and ZIP folders
  47. }
  48. string entryName = Path.Combine(parentEntryName, dirName);
  49. await CopyFilesAndDirectoriesAsync(directory, entryName, archive);
  50. }
  51. // Add an entry for the current directory if it contains only subdirectories
  52. if (!string.IsNullOrEmpty(parentEntryName) && !Directory.GetFiles(sourceDir).Any())
  53. {
  54. string entryName = parentEntryName + "/";
  55. archive.CreateEntry(entryName);
  56. }
  57. }
  58. }
  59. }