Program.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using SevenZip;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. namespace SevenRepacker
  7. {
  8. internal class Program
  9. {
  10. private static int Main(string[] args)
  11. {
  12. #if DEBUG
  13. SevenZipBase.SetLibraryPath(Environment.Is64BitProcess
  14. ? "x64/7z.dll"
  15. : "x86/7z.dll");
  16. #else
  17. SevenZipBase.SetLibraryPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "7z.dll"));
  18. #endif
  19. string outDir = null;
  20. var inputFiles = new List<string>();
  21. foreach (var arg in args)
  22. {
  23. if (arg.StartsWith('/') && arg.Contains(':') && arg[^1] != ':')
  24. {
  25. var kv = arg.Substring(1).Split(":", 2);
  26. switch (kv[0].ToLower())
  27. {
  28. case "out-dir":
  29. outDir = kv[1];
  30. if (false == Directory.Exists(outDir))
  31. {
  32. Console.Error.WriteLine($"Arg ERROR. out dir not found: {outDir}");
  33. return -1;
  34. }
  35. break;
  36. }
  37. continue;
  38. }
  39. inputFiles.Add(arg);
  40. }
  41. foreach (var inputFilePath in inputFiles)
  42. {
  43. Console.WriteLine("Process start");
  44. if (!File.Exists(inputFilePath))
  45. {
  46. Console.WriteLine($"ERR, Input file not found: {inputFilePath}");
  47. continue;
  48. }
  49. var outputFilePath = Path.ChangeExtension(inputFilePath, ".zip");
  50. if (outDir != null)
  51. {
  52. outputFilePath = Path.Combine(outDir, Path.GetFileName(outputFilePath));
  53. }
  54. if (File.Exists(outputFilePath))
  55. {
  56. Console.WriteLine($"SKIP, Output file already exist: {outputFilePath}");
  57. continue;
  58. }
  59. Console.WriteLine($" In: {inputFilePath}");
  60. Console.WriteLine($" Out: {outputFilePath}");
  61. using var inputArchive = new SevenZipExtractor(inputFilePath);
  62. var inputItems = inputArchive.ArchiveFileData.OrderBy(p => p.Index).ToArray();
  63. var streamDict = new Dictionary<string, Stream>();
  64. foreach (var item in inputItems)
  65. {
  66. if (item.IsDirectory) continue;
  67. streamDict.Add(item.FileName, new BridgeStream(1, (long?)item.Size, inputArchive, item.Index));
  68. }
  69. ////////////////////
  70. var outputArchive = new SevenZipCompressor
  71. {
  72. ArchiveFormat = OutArchiveFormat.Zip,
  73. CompressionMethod = CompressionMethod.Copy,
  74. CompressionMode = CompressionMode.Create,
  75. };
  76. outputArchive.FileCompressionStarted += (_, eventArgs) => Console.WriteLine($"EntryStarted:{eventArgs.FileName} ");
  77. outputArchive.Compressing += (_, eventArgs) => Console.Write($"{eventArgs.PercentDone}% ");
  78. outputArchive.FileCompressionFinished += (_, _) => Console.WriteLine($"EntryFinished");
  79. outputArchive.CompressStreamDictionary(streamDict, outputFilePath);
  80. Console.WriteLine("Process Finished");
  81. }
  82. return 0;
  83. }
  84. }
  85. }