From a602686551ff30cf16e90e8c96a93b1279717032 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sun, 5 Jul 2026 23:28:24 -0400 Subject: [PATCH] Trim path separators from start of filenames on extract --- SabreTools.Wrappers/BFPK.Extraction.cs | 1 + SabreTools.Wrappers/BSP.Extraction.cs | 1 + SabreTools.Wrappers/BZip2.Extraction.cs | 2 ++ SabreTools.Wrappers/CFB.Extraction.cs | 1 + SabreTools.Wrappers/GCF.Extraction.cs | 1 + SabreTools.Wrappers/GZip.Extraction.cs | 1 + SabreTools.Wrappers/InstallShieldArchiveV3.Extraction.cs | 1 + SabreTools.Wrappers/InstallShieldCabinet.Extraction.cs | 1 + SabreTools.Wrappers/InstallShieldExecutable.Extraction.cs | 1 + SabreTools.Wrappers/LZKWAJ.Extraction.cs | 1 + SabreTools.Wrappers/LZQBasic.Extraction.cs | 1 + SabreTools.Wrappers/LZSZDD.Extraction.cs | 1 + SabreTools.Wrappers/MicrosoftCabinet.Extraction.cs | 4 +--- SabreTools.Wrappers/PAK.Extraction.cs | 1 + SabreTools.Wrappers/PFF.Extraction.cs | 1 + SabreTools.Wrappers/PKZIP.Extraction.cs | 1 + SabreTools.Wrappers/PortableExecutable.Extraction.cs | 2 ++ SabreTools.Wrappers/RAR.Extraction.cs | 1 + SabreTools.Wrappers/SGA.Extraction.cs | 1 + SabreTools.Wrappers/SecuROMMatroschkaPackage.Extraction.cs | 1 + SabreTools.Wrappers/SevenZip.Extraction.cs | 1 + SabreTools.Wrappers/TapeArchive.Extraction.cs | 2 ++ SabreTools.Wrappers/VBSP.Extraction.cs | 1 + SabreTools.Wrappers/VPK.Extraction.cs | 1 + SabreTools.Wrappers/WAD3.Extraction.cs | 1 + SabreTools.Wrappers/XZ.Extraction.cs | 1 + SabreTools.Wrappers/XZP.Extraction.cs | 1 + SabreTools.Wrappers/ZSTD.Extraction.cs | 1 + 28 files changed, 31 insertions(+), 3 deletions(-) diff --git a/SabreTools.Wrappers/BFPK.Extraction.cs b/SabreTools.Wrappers/BFPK.Extraction.cs index e2aef88a..86d0e7b4 100644 --- a/SabreTools.Wrappers/BFPK.Extraction.cs +++ b/SabreTools.Wrappers/BFPK.Extraction.cs @@ -63,6 +63,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = file.Name.Length == 0 ? $"file{index}" : file.Name; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/BSP.Extraction.cs b/SabreTools.Wrappers/BSP.Extraction.cs index f3d657a1..6688ace7 100644 --- a/SabreTools.Wrappers/BSP.Extraction.cs +++ b/SabreTools.Wrappers/BSP.Extraction.cs @@ -66,6 +66,7 @@ namespace SabreTools.Wrappers return false; // Ensure directory separators are consistent + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/BZip2.Extraction.cs b/SabreTools.Wrappers/BZip2.Extraction.cs index b4ed24f6..5278a31c 100644 --- a/SabreTools.Wrappers/BZip2.Extraction.cs +++ b/SabreTools.Wrappers/BZip2.Extraction.cs @@ -25,6 +25,8 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = Guid.NewGuid().ToString(); + filename = filename.TrimStart(['\\', '/']); + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/CFB.Extraction.cs b/SabreTools.Wrappers/CFB.Extraction.cs index 91d841a9..bbd13bcb 100644 --- a/SabreTools.Wrappers/CFB.Extraction.cs +++ b/SabreTools.Wrappers/CFB.Extraction.cs @@ -72,6 +72,7 @@ namespace SabreTools.Wrappers } // Ensure directory separators are consistent + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/GCF.Extraction.cs b/SabreTools.Wrappers/GCF.Extraction.cs index 0f2ebae2..cbd65ab6 100644 --- a/SabreTools.Wrappers/GCF.Extraction.cs +++ b/SabreTools.Wrappers/GCF.Extraction.cs @@ -72,6 +72,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = file.Path ?? $"file{index}"; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/GZip.Extraction.cs b/SabreTools.Wrappers/GZip.Extraction.cs index 9e499f63..ab575942 100644 --- a/SabreTools.Wrappers/GZip.Extraction.cs +++ b/SabreTools.Wrappers/GZip.Extraction.cs @@ -40,6 +40,7 @@ namespace SabreTools.Wrappers ?? (Filename is not null ? Path.GetFileName(Filename).Replace(".gz", string.Empty) : null) ?? $"extracted_file"; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/InstallShieldArchiveV3.Extraction.cs b/SabreTools.Wrappers/InstallShieldArchiveV3.Extraction.cs index ce3c7354..c6bf7293 100644 --- a/SabreTools.Wrappers/InstallShieldArchiveV3.Extraction.cs +++ b/SabreTools.Wrappers/InstallShieldArchiveV3.Extraction.cs @@ -95,6 +95,7 @@ namespace SabreTools.Wrappers return false; // Ensure directory separators are consistent + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/InstallShieldCabinet.Extraction.cs b/SabreTools.Wrappers/InstallShieldCabinet.Extraction.cs index 8132b649..b829fc69 100644 --- a/SabreTools.Wrappers/InstallShieldCabinet.Extraction.cs +++ b/SabreTools.Wrappers/InstallShieldCabinet.Extraction.cs @@ -266,6 +266,7 @@ namespace SabreTools.Wrappers #endif // Ensure directory separators are consistent + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/InstallShieldExecutable.Extraction.cs b/SabreTools.Wrappers/InstallShieldExecutable.Extraction.cs index 3f8c7837..63d8e75a 100644 --- a/SabreTools.Wrappers/InstallShieldExecutable.Extraction.cs +++ b/SabreTools.Wrappers/InstallShieldExecutable.Extraction.cs @@ -27,6 +27,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent var filename = entry.Path.TrimEnd('\0'); + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/LZKWAJ.Extraction.cs b/SabreTools.Wrappers/LZKWAJ.Extraction.cs index b5cc0cad..862909e2 100644 --- a/SabreTools.Wrappers/LZKWAJ.Extraction.cs +++ b/SabreTools.Wrappers/LZKWAJ.Extraction.cs @@ -34,6 +34,7 @@ namespace SabreTools.Wrappers filename += $".{FileExtension}"; // Ensure directory separators are consistent + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/LZQBasic.Extraction.cs b/SabreTools.Wrappers/LZQBasic.Extraction.cs index 6d08cb0d..8831646f 100644 --- a/SabreTools.Wrappers/LZQBasic.Extraction.cs +++ b/SabreTools.Wrappers/LZQBasic.Extraction.cs @@ -30,6 +30,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = "tempfile.bin"; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/LZSZDD.Extraction.cs b/SabreTools.Wrappers/LZSZDD.Extraction.cs index 8e3aef1f..3d149aba 100644 --- a/SabreTools.Wrappers/LZSZDD.Extraction.cs +++ b/SabreTools.Wrappers/LZSZDD.Extraction.cs @@ -42,6 +42,7 @@ namespace SabreTools.Wrappers return false; // Ensure directory separators are consistent + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/MicrosoftCabinet.Extraction.cs b/SabreTools.Wrappers/MicrosoftCabinet.Extraction.cs index 84976411..5e4de53d 100644 --- a/SabreTools.Wrappers/MicrosoftCabinet.Extraction.cs +++ b/SabreTools.Wrappers/MicrosoftCabinet.Extraction.cs @@ -371,10 +371,8 @@ namespace SabreTools.Wrappers /// Filestream opened for the file private FileStream GetFileStream(string filename, string outputDirectory) { - // Trim directory separators from the start - filename = filename.TrimStart(['\\', '/']); - // Ensure directory separators are consistent + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/PAK.Extraction.cs b/SabreTools.Wrappers/PAK.Extraction.cs index 6094053d..3c7d1ce8 100644 --- a/SabreTools.Wrappers/PAK.Extraction.cs +++ b/SabreTools.Wrappers/PAK.Extraction.cs @@ -52,6 +52,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = directoryItem.ItemName.Length == 0 ? $"file{index}" : directoryItem.ItemName; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/PFF.Extraction.cs b/SabreTools.Wrappers/PFF.Extraction.cs index 127372e4..c4f0ecea 100644 --- a/SabreTools.Wrappers/PFF.Extraction.cs +++ b/SabreTools.Wrappers/PFF.Extraction.cs @@ -52,6 +52,7 @@ namespace SabreTools.Wrappers { // Ensure directory separators are consistent string filename = segment.FileName ?? $"file{index}"; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/PKZIP.Extraction.cs b/SabreTools.Wrappers/PKZIP.Extraction.cs index 989d1c01..3729b357 100644 --- a/SabreTools.Wrappers/PKZIP.Extraction.cs +++ b/SabreTools.Wrappers/PKZIP.Extraction.cs @@ -74,6 +74,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = entry.Key; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/PortableExecutable.Extraction.cs b/SabreTools.Wrappers/PortableExecutable.Extraction.cs index 7f44b6d1..761547ab 100644 --- a/SabreTools.Wrappers/PortableExecutable.Extraction.cs +++ b/SabreTools.Wrappers/PortableExecutable.Extraction.cs @@ -83,6 +83,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = entry.Name.Length == 0 ? $"FILE_{i}" : entry.Name; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') @@ -601,6 +602,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = entry.Filename?.TrimEnd('\0') ?? $"FILE_{i}"; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/RAR.Extraction.cs b/SabreTools.Wrappers/RAR.Extraction.cs index 05ff9d62..4b7c3e16 100644 --- a/SabreTools.Wrappers/RAR.Extraction.cs +++ b/SabreTools.Wrappers/RAR.Extraction.cs @@ -240,6 +240,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = entry.Key; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/SGA.Extraction.cs b/SabreTools.Wrappers/SGA.Extraction.cs index 9efe14a6..aa13595b 100644 --- a/SabreTools.Wrappers/SGA.Extraction.cs +++ b/SabreTools.Wrappers/SGA.Extraction.cs @@ -120,6 +120,7 @@ namespace SabreTools.Wrappers return false; // Ensure directory separators are consistent + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/SecuROMMatroschkaPackage.Extraction.cs b/SabreTools.Wrappers/SecuROMMatroschkaPackage.Extraction.cs index 157beb2a..30fbb9b7 100644 --- a/SabreTools.Wrappers/SecuROMMatroschkaPackage.Extraction.cs +++ b/SabreTools.Wrappers/SecuROMMatroschkaPackage.Extraction.cs @@ -49,6 +49,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = entry.Path.TrimEnd('\0'); + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/SevenZip.Extraction.cs b/SabreTools.Wrappers/SevenZip.Extraction.cs index 8e7544ed..4b01832b 100644 --- a/SabreTools.Wrappers/SevenZip.Extraction.cs +++ b/SabreTools.Wrappers/SevenZip.Extraction.cs @@ -211,6 +211,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = entry.Key; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/TapeArchive.Extraction.cs b/SabreTools.Wrappers/TapeArchive.Extraction.cs index 4f22920e..e81463f7 100644 --- a/SabreTools.Wrappers/TapeArchive.Extraction.cs +++ b/SabreTools.Wrappers/TapeArchive.Extraction.cs @@ -77,6 +77,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent entryDirectory = Path.Combine(outputDirectory, entryDirectory); + entryDirectory = entryDirectory.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') entryDirectory = entryDirectory.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') @@ -136,6 +137,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = header.FileName?.TrimEnd('\0') ?? $"entry_{i}"; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/VBSP.Extraction.cs b/SabreTools.Wrappers/VBSP.Extraction.cs index ac9df864..8425353f 100644 --- a/SabreTools.Wrappers/VBSP.Extraction.cs +++ b/SabreTools.Wrappers/VBSP.Extraction.cs @@ -66,6 +66,7 @@ namespace SabreTools.Wrappers #pragma warning restore IDE0010 // Ensure directory separators are consistent + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/VPK.Extraction.cs b/SabreTools.Wrappers/VPK.Extraction.cs index 9e3be57d..d8f9fb75 100644 --- a/SabreTools.Wrappers/VPK.Extraction.cs +++ b/SabreTools.Wrappers/VPK.Extraction.cs @@ -111,6 +111,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = $"{directoryItem.Name}.{directoryItem.Extension}"; + filename = filename.TrimStart(['\\', '/']); if (!string.IsNullOrEmpty(directoryItem.Path)) filename = Path.Combine(directoryItem.Path, filename); if (Path.DirectorySeparatorChar == '\\') diff --git a/SabreTools.Wrappers/WAD3.Extraction.cs b/SabreTools.Wrappers/WAD3.Extraction.cs index 148ad5e8..abaec07f 100644 --- a/SabreTools.Wrappers/WAD3.Extraction.cs +++ b/SabreTools.Wrappers/WAD3.Extraction.cs @@ -52,6 +52,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = $"{lump.Name}.lmp"; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/XZ.Extraction.cs b/SabreTools.Wrappers/XZ.Extraction.cs index 7b78e1d3..53549039 100644 --- a/SabreTools.Wrappers/XZ.Extraction.cs +++ b/SabreTools.Wrappers/XZ.Extraction.cs @@ -30,6 +30,7 @@ namespace SabreTools.Wrappers string filename = Filename is not null ? Path.GetFileNameWithoutExtension(Filename) : Guid.NewGuid().ToString(); + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/XZP.Extraction.cs b/SabreTools.Wrappers/XZP.Extraction.cs index ac722e33..972e4f9f 100644 --- a/SabreTools.Wrappers/XZP.Extraction.cs +++ b/SabreTools.Wrappers/XZP.Extraction.cs @@ -61,6 +61,7 @@ namespace SabreTools.Wrappers // Ensure directory separators are consistent string filename = directoryItem.Name ?? $"file{index}"; + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/') diff --git a/SabreTools.Wrappers/ZSTD.Extraction.cs b/SabreTools.Wrappers/ZSTD.Extraction.cs index 7d249b3c..df70a583 100644 --- a/SabreTools.Wrappers/ZSTD.Extraction.cs +++ b/SabreTools.Wrappers/ZSTD.Extraction.cs @@ -32,6 +32,7 @@ namespace SabreTools.Wrappers { // Ensure directory separators are consistent string filename = string.IsNullOrEmpty(Filename) ? "filename" : Path.GetFileNameWithoutExtension(Filename); + filename = filename.TrimStart(['\\', '/']); if (Path.DirectorySeparatorChar == '\\') filename = filename.Replace('/', '\\'); else if (Path.DirectorySeparatorChar == '/')