diff --git a/src/SharpCompress/Common/ExtractionMethods.cs b/src/SharpCompress/Common/ExtractionMethods.cs index 27d41648..799d47b3 100644 --- a/src/SharpCompress/Common/ExtractionMethods.cs +++ b/src/SharpCompress/Common/ExtractionMethods.cs @@ -37,6 +37,7 @@ public static void WriteEntryToDirectory( options ??= new ExtractionOptions() { Overwrite = true }; var file = Path.GetFileName(entry.Key.NotNull("Entry Key is null")).NotNull("File is null"); + file = Utility.ReplaceInvalidFileNameChars(file); if (options.ExtractFullPath) { var folder = Path.GetDirectoryName(entry.Key.NotNull("Entry Key is null")) diff --git a/src/SharpCompress/Utility.cs b/src/SharpCompress/Utility.cs index bcecafb4..47da1fef 100644 --- a/src/SharpCompress/Utility.cs +++ b/src/SharpCompress/Utility.cs @@ -2,6 +2,7 @@ using System.Buffers; using System.Collections.Generic; using System.IO; +using System.Text; using SharpCompress.Readers; namespace SharpCompress; @@ -434,4 +435,17 @@ public static void SetBigUInt32(ref byte[] buffer, uint number, long offset) buffer[offset + 2] = (byte)(number >> 8); buffer[offset + 3] = (byte)number; } + + public static string ReplaceInvalidFileNameChars(string fileName) + { + var invalidChars = new HashSet(Path.GetInvalidFileNameChars()); + var sb = new StringBuilder(fileName.Length); + foreach (var c in fileName) + { + var newChar = invalidChars.Contains(c) ? '_' : c; + sb.Append(newChar); + } + + return sb.ToString(); + } }