From a777df13dbd7bc1705fd2bc9a9d03784d399301e Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 18 May 2026 13:35:59 -0400 Subject: [PATCH] Take directory into account for IS-CAB --- .../InstallShieldCabinet.Extraction.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/SabreTools.Wrappers/InstallShieldCabinet.Extraction.cs b/SabreTools.Wrappers/InstallShieldCabinet.Extraction.cs index 5c2a85e6..6d7cbaf8 100644 --- a/SabreTools.Wrappers/InstallShieldCabinet.Extraction.cs +++ b/SabreTools.Wrappers/InstallShieldCabinet.Extraction.cs @@ -55,6 +55,11 @@ namespace SabreTools.Wrappers /// private const int MAX_WBITS = 15; + /// + /// Characters that should be replaced by an underscore for filenames + /// + private static readonly char[] PathReplacementCharacters = [' ', '<', '>', '[', ']']; + #endregion #region Cabinet Set @@ -236,13 +241,24 @@ namespace SabreTools.Wrappers if (!cabinet.FileIsValid(i)) continue; - // Ensure directory separators are consistent + // Build the full path from the cabinet string filename = cabinet.GetFileName(i) ?? $"BAD_FILENAME{i}"; + uint dirIndex = cabinet.GetDirectoryIndexFromFile(i); + string dir = cabinet.GetDirectoryName((int)dirIndex) ?? $"BAD_DIRNAME{dirIndex}"; + filename = Path.Combine(dir, filename); + + // Ensure directory separators are consistent if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') filename = filename.Replace('\\', '/'); + // Consistently replace problematic path characters + foreach (char c in PathReplacementCharacters) + { + filename = filename.Replace(c, '_'); + } + // Ensure the full output directory exists filename = Path.Combine(outputDirectory, filename); var directoryName = Path.GetDirectoryName(filename);