From 32a261963a9e83774db03ba32e86bb8c32f25cc3 Mon Sep 17 00:00:00 2001 From: "Namhyeon, Go" Date: Sat, 17 May 2025 11:26:46 +0900 Subject: [PATCH 1/5] One more fix #254 --- .../WelsonJS.Launcher/ZipExtractor.cs | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs index 01bab9a..8ea6610 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; +using System.Security.Cryptography; using System.Threading.Tasks; namespace WelsonJS.Launcher @@ -16,6 +17,7 @@ namespace WelsonJS.Launcher public string FileName { get; set; } public string Path { get; set; } public Func ExtractCommand { get; set; } + public bool UseCmd { get; set; } = false; } private readonly List AvailableExtractors; @@ -60,6 +62,13 @@ namespace WelsonJS.Launcher ExtractCommand = (src, dest) => $"x -o:\"{dest}\" \"{src}\" -y" }, new Extractor + { + Name = "jar (Java SDK)", + FileName = "jar.exe", + ExtractCommand = (src, dest) => $"jar xf \"{src}\"", + UseCmd = true + }, + new Extractor { Name = "tar (Windows)", // Windows 10 build 17063 or later FileName = "tar.exe", @@ -91,7 +100,7 @@ namespace WelsonJS.Launcher foreach (var extractor in AvailableExtractors.Where(e => e.Path != null)) { - if (RunProcess(extractor.Path, extractor.ExtractCommand(filePath, workingDirectory))) + if (RunProcess(extractor.Path, extractor, workingDirectory)) return true; } @@ -167,18 +176,28 @@ namespace WelsonJS.Launcher } } } - catch { - // ignore an exception + catch (Exception ex) + { + Trace.TraceInformation($"Ignored file or directory: {ex.Message}"); } } } - private bool RunProcess(string executableFilePath, string arguments) + private bool RunProcess(string executableFilePath, string arguments, string workingDirectory, bool useCmd = false) { + var fileName = executableFilePath; + var adjustedArguments = arguments; + + if (useCmd && !String.IsNullOrEmpty(workingDirectory)) + { + fileName = "cmd.exe"; + adjustedArguments = $"/c cd /d \"{workingDirectory}\" && {arguments}"; + } + var psi = new ProcessStartInfo { - FileName = executableFilePath, - Arguments = arguments, + FileName = fileName, + Arguments = adjustedArguments, RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, @@ -193,13 +212,22 @@ namespace WelsonJS.Launcher } } + private bool RunProcess(string executableFilePath, Extractor extractor, string workingDirectory) + { + return RunProcess(executableFilePath, + extractor.ExtractCommand(extractor.FileName, workingDirectory), + workingDirectory, + extractor.UseCmd + ); + } + private bool ExtractUsingPowerShell(string filePath, string workingDirectory) { var escapedSrc = filePath.Replace("'", "''"); var escapedDest = workingDirectory.Replace("'", "''"); var script = $"Expand-Archive -LiteralPath '{escapedSrc}' -DestinationPath '{escapedDest}' -Force"; - return RunProcess("powershell.exe", $"-NoProfile -Command \"{script}\""); + return RunProcess("powershell.exe", $"-NoProfile -Command \"{script}\"", workingDirectory); } private bool ExtractUsingShell(string filePath, string workingDirectory) From c2f578a1c8a91b176ffdc5f31d160b1e16867808 Mon Sep 17 00:00:00 2001 From: "Namhyeon, Go" Date: Sat, 17 May 2025 11:32:13 +0900 Subject: [PATCH 2/5] Remove the unnecessary line --- WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs index 8ea6610..d6c9691 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs @@ -4,7 +4,6 @@ using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; -using System.Security.Cryptography; using System.Threading.Tasks; namespace WelsonJS.Launcher From ca9caef94ed4c3d0f7ca42ea8942ccc767986e71 Mon Sep 17 00:00:00 2001 From: "Namhyeon, Go" Date: Sat, 17 May 2025 11:50:27 +0900 Subject: [PATCH 3/5] One more fix #254 --- WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs index d6c9691..247b8ab 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs @@ -64,7 +64,7 @@ namespace WelsonJS.Launcher { Name = "jar (Java SDK)", FileName = "jar.exe", - ExtractCommand = (src, dest) => $"jar xf \"{src}\"", + ExtractCommand = (src, dest) => $"xf \"{src}\"", UseCmd = true }, new Extractor @@ -190,7 +190,7 @@ namespace WelsonJS.Launcher if (useCmd && !String.IsNullOrEmpty(workingDirectory)) { fileName = "cmd.exe"; - adjustedArguments = $"/c cd /d \"{workingDirectory}\" && {arguments}"; + adjustedArguments = $"/c cd /d \"{workingDirectory}\" && \"{executableFilePath}\" {arguments}"; } var psi = new ProcessStartInfo From f60754d9d4cdb82e5431518aafe25934a5661a67 Mon Sep 17 00:00:00 2001 From: "Namhyeon, Go" Date: Sat, 17 May 2025 12:54:07 +0900 Subject: [PATCH 4/5] One more fix #254 --- .../WelsonJS.Launcher/MainForm.cs | 4 ++ .../WelsonJS.Launcher/ZipExtractor.cs | 59 +++++++++++++------ 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/MainForm.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/MainForm.cs index d403103..df444ce 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/MainForm.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/MainForm.cs @@ -144,6 +144,10 @@ namespace WelsonJS.Launcher // Run the application Program.RunCommandPrompt(workingDirectory, entryFileName, scriptName, cbUseSpecificScript.Checked, cbInteractiveServiceApp.Checked); } + else + { + MessageBox.Show("Failed to extract the ZIP file."); + } } catch (Exception ex) { diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs index 247b8ab..36ea3f5 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Threading.Tasks; +using System.Windows.Forms; namespace WelsonJS.Launcher { @@ -23,6 +24,7 @@ namespace WelsonJS.Launcher public ZipExtractor() { + // Searches the computer for any known third-party ZIP utilities. AvailableExtractors = new List{ new Extractor { @@ -61,6 +63,12 @@ namespace WelsonJS.Launcher ExtractCommand = (src, dest) => $"x -o:\"{dest}\" \"{src}\" -y" }, new Extractor + { + Name = "IZArc", + FileName = "izarce.exe", + ExtractCommand = (src, dest) => $"-d -p\"{dest}\" \"{src}\"" + }, + new Extractor { Name = "jar (Java SDK)", FileName = "jar.exe", @@ -99,14 +107,14 @@ namespace WelsonJS.Launcher foreach (var extractor in AvailableExtractors.Where(e => e.Path != null)) { - if (RunProcess(extractor.Path, extractor, workingDirectory)) + if (RunProcess(extractor, filePath, workingDirectory, true)) return true; } - if (ExtractUsingPowerShell(filePath, workingDirectory)) + if (ExtractUsingPowerShell(filePath, workingDirectory, true)) return true; - if (ExtractUsingShell(filePath, workingDirectory)) + if (ExtractUsingShell(filePath, workingDirectory, true)) return true; return false; @@ -182,45 +190,60 @@ namespace WelsonJS.Launcher } } - private bool RunProcess(string executableFilePath, string arguments, string workingDirectory, bool useCmd = false) + private bool RunProcess(string execFilePath, string arguments, string workingDirectory, bool useCmd = false, bool showConsole = false) { - var fileName = executableFilePath; - var adjustedArguments = arguments; + int exitCode = -1; + + string fileName = execFilePath; + string adjustedArguments = arguments; if (useCmd && !String.IsNullOrEmpty(workingDirectory)) { fileName = "cmd.exe"; - adjustedArguments = $"/c cd /d \"{workingDirectory}\" && \"{executableFilePath}\" {arguments}"; + adjustedArguments = $"/c cd /d \"{workingDirectory}\" && \"{execFilePath}\" {arguments}"; } var psi = new ProcessStartInfo { FileName = fileName, Arguments = adjustedArguments, - RedirectStandardOutput = true, - RedirectStandardError = true, - UseShellExecute = false, - CreateNoWindow = true + WorkingDirectory = workingDirectory, + RedirectStandardOutput = !showConsole, + RedirectStandardError = !showConsole, + UseShellExecute = showConsole, + CreateNoWindow = !showConsole }; using (var process = new Process { StartInfo = psi, EnableRaisingEvents = true }) { process.Start(); process.WaitForExit(); - return process.ExitCode == 0; + exitCode = process.ExitCode; } + + if (exitCode != 0) + { + Trace.TraceWarning($"{fileName} exit with code {exitCode}"); + } + else + { + Trace.TraceInformation($"{fileName} finished successfully"); + } + + return exitCode == 0; } - private bool RunProcess(string executableFilePath, Extractor extractor, string workingDirectory) + private bool RunProcess(Extractor extractor, string filePath, string workingDirectory, bool showConsole = false) { - return RunProcess(executableFilePath, - extractor.ExtractCommand(extractor.FileName, workingDirectory), + return RunProcess(extractor.Path, + extractor.ExtractCommand(filePath, workingDirectory), workingDirectory, - extractor.UseCmd + extractor.UseCmd, + showConsole ); } - private bool ExtractUsingPowerShell(string filePath, string workingDirectory) + private bool ExtractUsingPowerShell(string filePath, string workingDirectory, bool showConsole = false) { var escapedSrc = filePath.Replace("'", "''"); var escapedDest = workingDirectory.Replace("'", "''"); @@ -229,7 +252,7 @@ namespace WelsonJS.Launcher return RunProcess("powershell.exe", $"-NoProfile -Command \"{script}\"", workingDirectory); } - private bool ExtractUsingShell(string filePath, string workingDirectory) + private bool ExtractUsingShell(string filePath, string workingDirectory, bool showConsole = false) { var shellAppType = Type.GetTypeFromProgID("Shell.Application"); if (shellAppType == null) From b2db6a4b0a845fd96702286d03c7aaaa52b3d58e Mon Sep 17 00:00:00 2001 From: "Namhyeon, Go" Date: Sat, 17 May 2025 14:14:15 +0900 Subject: [PATCH 5/5] One more fix #254 --- WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs b/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs index 36ea3f5..7e86d64 100644 --- a/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs +++ b/WelsonJS.Toolkit/WelsonJS.Launcher/ZipExtractor.cs @@ -194,14 +194,8 @@ namespace WelsonJS.Launcher { int exitCode = -1; - string fileName = execFilePath; - string adjustedArguments = arguments; - - if (useCmd && !String.IsNullOrEmpty(workingDirectory)) - { - fileName = "cmd.exe"; - adjustedArguments = $"/c cd /d \"{workingDirectory}\" && \"{execFilePath}\" {arguments}"; - } + string fileName = useCmd ? "cmd.exe" : execFilePath; + string adjustedArguments = useCmd ? $"/c \"{execFilePath}\" {arguments}" : arguments; var psi = new ProcessStartInfo { @@ -222,13 +216,9 @@ namespace WelsonJS.Launcher } if (exitCode != 0) - { Trace.TraceWarning($"{fileName} exit with code {exitCode}"); - } else - { Trace.TraceInformation($"{fileName} finished successfully"); - } return exitCode == 0; }