Program.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System.Diagnostics;
  2. if (args.Length < 2)
  3. {
  4. Console.WriteLine("Err: at least 2 args required, <inputDir> <outputDir> [-lossless]");
  5. return 1;
  6. }
  7. var inputDir = args[0];
  8. var outputDir = args[1];
  9. if (!Directory.Exists(inputDir))
  10. {
  11. Console.WriteLine("Err: inputDir dose not exist");
  12. return 1;
  13. }
  14. if (!Directory.Exists(outputDir))
  15. {
  16. Console.WriteLine("Err: outputDir dose not exist");
  17. return 1;
  18. }
  19. var flagLossLess = false;
  20. if (args.Length > 2)
  21. {
  22. if (args[2] == "-lossless")
  23. {
  24. flagLossLess = true;
  25. }
  26. else
  27. {
  28. Console.WriteLine("Warn: invalid arg#3, should be [-lossless], set lossless flag to false");
  29. }
  30. }
  31. Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.Idle;
  32. var fullInputDir = Path.GetFullPath(inputDir);
  33. var fullOutputDir = Path.GetFullPath(outputDir);
  34. var filePathsToProcess = Directory.GetFiles(fullInputDir, "*", SearchOption.AllDirectories);
  35. void ProcessFunc(string inputFilePath)
  36. {
  37. var outputFilePath = Path.ChangeExtension(Path.Combine(fullOutputDir, inputFilePath[(fullInputDir.Length + 1)..]), ".webp");
  38. if (File.Exists(outputFilePath))
  39. {
  40. lock (Console.Out) Console.WriteLine("SKIP EXIST: " + outputFilePath);
  41. return;
  42. }
  43. var outputFileDir = Path.GetDirectoryName(outputFilePath);
  44. if (Directory.Exists(outputFileDir) == false)
  45. {
  46. lock (Console.Out) Console.WriteLine("Create dir: " + outputFileDir);
  47. Directory.CreateDirectory(outputFileDir);
  48. }
  49. var pWebp = new Process
  50. {
  51. StartInfo =
  52. {
  53. FileName = "cwebp",
  54. ArgumentList =
  55. {
  56. inputFilePath, "-o", outputFilePath , "-quiet"
  57. },
  58. UseShellExecute = false,
  59. CreateNoWindow = false,
  60. }
  61. };
  62. if (flagLossLess) pWebp.StartInfo.ArgumentList.Add("-lossless");
  63. pWebp.Start();
  64. pWebp.WaitForExit();
  65. lock (Console.Out) Console.WriteLine($"PROCESS {pWebp.ExitCode} {outputFilePath}");
  66. if (pWebp.ExitCode != 0)
  67. {
  68. int bp = 0;
  69. }
  70. }
  71. Parallel.ForEach(filePathsToProcess, ProcessFunc);
  72. // for debug
  73. //foreach (var s in filePathsToProcess)
  74. //{
  75. // ProcessFunc(s);
  76. //}
  77. return 0;