From 1b20bb06ada64956e6585e7227380555978cbdc8 Mon Sep 17 00:00:00 2001 From: Michael Bucari-Tovo Date: Fri, 24 Jun 2022 23:23:08 -0600 Subject: [PATCH] Add some filename length headroom in case of diplicate files and " (n)" suffix. --- Source/FileManager/FileNamingTemplate.cs | 16 ++++++++++----- Source/FileManager/ReplacementCharacters.cs | 22 +++++++++++---------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/Source/FileManager/FileNamingTemplate.cs b/Source/FileManager/FileNamingTemplate.cs index c00232a9..4d79c5af 100644 --- a/Source/FileManager/FileNamingTemplate.cs +++ b/Source/FileManager/FileNamingTemplate.cs @@ -35,18 +35,24 @@ namespace FileManager } else { - file = replaceFileName(file, paramReplacements); - fileName = Path.GetDirectoryName(fileName); pathParts.Add(file); + fileName = Path.GetDirectoryName(fileName); } } pathParts.Reverse(); + var fileNamePart = pathParts[^1]; + pathParts.Remove(fileNamePart); - return FileUtility.GetValidFilename(Path.Join(pathParts.ToArray()), replacements, returnFirstExisting); + LongPath directory = Path.Join(pathParts.Select(p => replaceFileName(p, paramReplacements, LongPath.MaxFilenameLength)).ToArray()); + + //If file already exists, GetValidFilename will append " (n)" to the filename. + //This could cause the filename length to exceed MaxFilenameLength, so reduce + //allowable filename length by 5 chars, allowing for up to 99 duplicates. + return FileUtility.GetValidFilename(Path.Join(directory, replaceFileName(fileNamePart, paramReplacements, LongPath.MaxFilenameLength - 5)), replacements, returnFirstExisting); } - private string replaceFileName(string filename, Dictionary paramReplacements) + private string replaceFileName(string filename, Dictionary paramReplacements, int maxFilenameLength) { List filenameParts = new(); //Build the filename in parts, replacing replacement parameters with @@ -82,7 +88,7 @@ namespace FileManager //Remove 1 character from the end of the longest filename part until //the total filename is less than max filename length - while (filenameParts.Sum(p => p.Length) > LongPath.MaxFilenameLength) + while (filenameParts.Sum(p => p.Length) > maxFilenameLength) { int maxLength = filenameParts.Max(p => p.Length); var maxEntry = filenameParts.First(p => p.Length == maxLength); diff --git a/Source/FileManager/ReplacementCharacters.cs b/Source/FileManager/ReplacementCharacters.cs index b81d3865..53fd9517 100644 --- a/Source/FileManager/ReplacementCharacters.cs +++ b/Source/FileManager/ReplacementCharacters.cs @@ -136,19 +136,21 @@ namespace FileManager { if (toReplace == Replacement.QUOTE_MARK) { - if (preceding == default || - (preceding != default - && !char.IsLetter(preceding) - && !char.IsNumber(preceding) - && (char.IsLetter(succeding) || char.IsNumber(succeding)) + if ( + preceding == default || + ( + !char.IsLetter(preceding) && + !char.IsNumber(preceding) && + (char.IsLetter(succeding) || char.IsNumber(succeding)) ) ) return OpenQuote; - else if (succeding == default || - (succeding != default - && !char.IsLetter(succeding) - && !char.IsNumber(succeding) - && (char.IsLetter(preceding) || char.IsNumber(preceding)) + else if ( + succeding == default || + ( + !char.IsLetter(succeding) && + !char.IsNumber(succeding) && + (char.IsLetter(preceding) || char.IsNumber(preceding)) ) ) return CloseQuote;