diff --git a/DiscordChatExporter.Domain/Exporting/ExportRequest.cs b/DiscordChatExporter.Domain/Exporting/ExportRequest.cs index 3b4f9f6..cddcd87 100644 --- a/DiscordChatExporter.Domain/Exporting/ExportRequest.cs +++ b/DiscordChatExporter.Domain/Exporting/ExportRequest.cs @@ -2,6 +2,7 @@ using System.IO; using System.Text; using DiscordChatExporter.Domain.Discord.Models; +using DiscordChatExporter.Domain.Internal; namespace DiscordChatExporter.Domain.Exporting { @@ -127,8 +128,7 @@ namespace DiscordChatExporter.Domain.Exporting buffer.Append($".{format.GetFileExtension()}"); // Replace invalid chars - foreach (var invalidChar in Path.GetInvalidFileNameChars()) - buffer.Replace(invalidChar, '_'); + PathEx.EscapePath(buffer); return buffer.ToString(); } diff --git a/DiscordChatExporter.Domain/Exporting/MediaDownloader.cs b/DiscordChatExporter.Domain/Exporting/MediaDownloader.cs index ee8d718..e1be584 100644 --- a/DiscordChatExporter.Domain/Exporting/MediaDownloader.cs +++ b/DiscordChatExporter.Domain/Exporting/MediaDownloader.cs @@ -27,10 +27,11 @@ namespace DiscordChatExporter.Domain.Exporting { var originalFileName = Regex.Match(url, @".+/([^?]*)").Groups[1].Value; - if (string.IsNullOrWhiteSpace(originalFileName)) - return GetRandomSuffix(); + var fileName = !string.IsNullOrWhiteSpace(originalFileName) ? + $"{Path.GetFileNameWithoutExtension(originalFileName)}-{GetRandomSuffix()}{Path.GetExtension(originalFileName)}" : + GetRandomSuffix(); - return $"{Path.GetFileNameWithoutExtension(originalFileName)}-{GetRandomSuffix()}{Path.GetExtension(originalFileName)}"; + return PathEx.EscapePath(fileName); } // HACK: ConfigureAwait() is crucial here to enable sync-over-async in HtmlMessageWriter diff --git a/DiscordChatExporter.Domain/Internal/PathEx.cs b/DiscordChatExporter.Domain/Internal/PathEx.cs new file mode 100644 index 0000000..83b5949 --- /dev/null +++ b/DiscordChatExporter.Domain/Internal/PathEx.cs @@ -0,0 +1,18 @@ +using System.IO; +using System.Text; + +namespace DiscordChatExporter.Domain.Internal +{ + internal static class PathEx + { + public static StringBuilder EscapePath(StringBuilder pathBuffer) + { + foreach (var invalidChar in Path.GetInvalidFileNameChars()) + pathBuffer.Replace(invalidChar, '_'); + + return pathBuffer; + } + + public static string EscapePath(string path) => EscapePath(new StringBuilder(path)).ToString(); + } +} \ No newline at end of file