ArchiveFileAccessor.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using ImageConvertService.Biz.Models;
  2. using SevenZip;
  3. namespace ImageConvertService.Biz;
  4. public class ArchiveFileAccessor
  5. {
  6. static ArchiveFileAccessor()
  7. {
  8. SevenZipBase.SetLibraryPath(@"C:\Program Files\7-Zip\7z.dll");
  9. }
  10. public ArchiveEntry[] ReadArchive(byte[] input) => ReadArchive(new MemoryStream(input));
  11. public ArchiveEntry[] ReadArchive(Stream stream)
  12. {
  13. using var sze = new SevenZipExtractor(stream);
  14. var ret = new List<ArchiveEntry>(sze.ArchiveFileData.Count(p => p.IsDirectory == false));
  15. foreach (var archiveFileInfo in sze.ArchiveFileData)
  16. {
  17. if (archiveFileInfo.IsDirectory) continue;
  18. var item = new ArchiveEntry
  19. {
  20. PathAndName = archiveFileInfo.FileName,
  21. LastWrite = archiveFileInfo.LastWriteTime,
  22. LastAccess = archiveFileInfo.LastAccessTime,
  23. CreateTime = archiveFileInfo.CreationTime,
  24. };
  25. var ms = new MemoryStream();
  26. sze.ExtractFile(archiveFileInfo.Index, ms);
  27. item.Content = ms.ToArray();
  28. ret.Add(item);
  29. }
  30. return ret.ToArray();
  31. }
  32. public byte[] MakeArchiveFastZip(IReadOnlyList<ArchiveEntry> input)
  33. {
  34. var compressor = new SevenZipCompressor
  35. {
  36. CompressionLevel = CompressionLevel.Fast,
  37. ArchiveFormat = OutArchiveFormat.Zip,
  38. CustomParameters =
  39. {
  40. { "mt", "on" },
  41. }
  42. };
  43. var msZip = new MemoryStream();
  44. compressor.CompressStreamDictionaryWithFileTime(
  45. input.ToDictionary(
  46. p => p.PathAndName,
  47. p => new CompressStreamEntry(new MemoryStream(p.Content), p.CreateTime, p.LastWrite, p.LastAccess)
  48. )
  49. , msZip
  50. );
  51. return msZip.ToArray();
  52. }
  53. public byte[] MakeArchiveFast7Z(IReadOnlyList<ArchiveEntry> input)
  54. {
  55. var compressor = new SevenZipCompressor
  56. {
  57. CompressionLevel = CompressionLevel.Fast,
  58. ArchiveFormat = OutArchiveFormat.SevenZip,
  59. CustomParameters =
  60. {
  61. { "mt", "on" },
  62. { "s", "off" },
  63. }
  64. };
  65. var msZip = new MemoryStream();
  66. compressor.CompressStreamDictionaryWithFileTime(
  67. input.ToDictionary(
  68. p => p.PathAndName,
  69. p => new CompressStreamEntry(new MemoryStream(p.Content), p.CreateTime, p.LastWrite, p.LastAccess)
  70. )
  71. , msZip
  72. );
  73. return msZip.ToArray();
  74. }
  75. }