using SevenZip; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace SevenRepacker { internal class Program { private static int Main(string[] args) { #if DEBUG SevenZipBase.SetLibraryPath(Environment.Is64BitProcess ? "x64/7z.dll" : "x86/7z.dll"); #else SevenZipBase.SetLibraryPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "7z.dll")); #endif string outDir = null; var inputFiles = new List(); foreach (var arg in args) { if (arg.StartsWith('/') && arg.Contains(':') && arg[^1] != ':') { var kv = arg.Substring(1).Split(":", 2); switch (kv[0].ToLower()) { case "out-dir": outDir = kv[1]; if (false == Directory.Exists(outDir)) { Console.Error.WriteLine($"Arg ERROR. out dir not found: {outDir}"); return -1; } break; } continue; } inputFiles.Add(arg); } foreach (var inputFilePath in inputFiles) { Console.WriteLine("Process start"); if (!File.Exists(inputFilePath)) { Console.WriteLine($"ERR, Input file not found: {inputFilePath}"); continue; } var outputFilePath = Path.ChangeExtension(inputFilePath, ".zip"); if (outDir != null) { outputFilePath = Path.Combine(outDir, Path.GetFileName(outputFilePath)); } if (File.Exists(outputFilePath)) { Console.WriteLine($"SKIP, Output file already exist: {outputFilePath}"); continue; } Console.WriteLine($" In: {inputFilePath}"); Console.WriteLine($" Out: {outputFilePath}"); using var inputArchive = new SevenZipExtractor(inputFilePath); var inputItems = inputArchive.ArchiveFileData.OrderBy(p => p.Index).ToArray(); var streamDict = new Dictionary(); foreach (var item in inputItems) { if (item.IsDirectory) continue; streamDict.Add(item.FileName, new BridgeStream(1, (long?)item.Size, inputArchive, item.Index)); } //////////////////// var outputArchive = new SevenZipCompressor { ArchiveFormat = OutArchiveFormat.Zip, CompressionMethod = CompressionMethod.Copy, CompressionMode = CompressionMode.Create, }; outputArchive.FileCompressionStarted += (_, eventArgs) => Console.WriteLine($"EntryStarted:{eventArgs.FileName} "); outputArchive.Compressing += (_, eventArgs) => Console.Write($"{eventArgs.PercentDone}% "); outputArchive.FileCompressionFinished += (_, _) => Console.WriteLine($"EntryFinished"); outputArchive.CompressStreamDictionary(streamDict, outputFilePath); Console.WriteLine("Process Finished"); } return 0; } } }