Add some filename length headroom in case of diplicate files and " (n)" suffix.

This commit is contained in:
Michael Bucari-Tovo 2022-06-24 23:23:08 -06:00
parent 5815a04712
commit 1b20bb06ad
2 changed files with 23 additions and 15 deletions

View File

@ -35,18 +35,24 @@ namespace FileManager
} }
else else
{ {
file = replaceFileName(file, paramReplacements);
fileName = Path.GetDirectoryName(fileName);
pathParts.Add(file); pathParts.Add(file);
fileName = Path.GetDirectoryName(fileName);
} }
} }
pathParts.Reverse(); 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<string,string> paramReplacements) private string replaceFileName(string filename, Dictionary<string,string> paramReplacements, int maxFilenameLength)
{ {
List<StringBuilder> filenameParts = new(); List<StringBuilder> filenameParts = new();
//Build the filename in parts, replacing replacement parameters with //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 //Remove 1 character from the end of the longest filename part until
//the total filename is less than max filename length //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); int maxLength = filenameParts.Max(p => p.Length);
var maxEntry = filenameParts.First(p => p.Length == maxLength); var maxEntry = filenameParts.First(p => p.Length == maxLength);

View File

@ -136,19 +136,21 @@ namespace FileManager
{ {
if (toReplace == Replacement.QUOTE_MARK) if (toReplace == Replacement.QUOTE_MARK)
{ {
if (preceding == default || if (
(preceding != default preceding == default ||
&& !char.IsLetter(preceding) (
&& !char.IsNumber(preceding) !char.IsLetter(preceding) &&
&& (char.IsLetter(succeding) || char.IsNumber(succeding)) !char.IsNumber(preceding) &&
(char.IsLetter(succeding) || char.IsNumber(succeding))
) )
) )
return OpenQuote; return OpenQuote;
else if (succeding == default || else if (
(succeding != default succeding == default ||
&& !char.IsLetter(succeding) (
&& !char.IsNumber(succeding) !char.IsLetter(succeding) &&
&& (char.IsLetter(preceding) || char.IsNumber(preceding)) !char.IsNumber(succeding) &&
(char.IsLetter(preceding) || char.IsNumber(preceding))
) )
) )
return CloseQuote; return CloseQuote;