public static string StripStringForFilename(string input, ValidityMode vmode = ValidityMode.AllowWhitelist, char?repl = null) { var output = new StringBuilder(input.Length); foreach (var c in input) { if (IsValidChar(c, vmode)) { output.Append(c); } else { if (repl != null) { output.Append(repl); } } } var fileName = output.ToString(); if (RESERVED_FILENAMES.Any(r => string.Equals(r, fileName, StringComparison.CurrentCultureIgnoreCase))) { fileName = "_" + fileName; } if (RESERVED_FILENAMES.Any(r => fileName.ToLower().StartsWith(r.ToLower() + "."))) { fileName = "_" + fileName; } return(fileName); }
private static bool IsValidChar(char chr, ValidityMode vmode) { if (vmode == ValidityMode.AllowAllCharacters) { return(!Path.GetInvalidFileNameChars().Contains(chr)); } else if (vmode == ValidityMode.AllowAllLetters) { return(ALLOWED_CHARACTER.Contains(chr) || char.GetUnicodeCategory(chr) == UnicodeCategory.LetterNumber || char.GetUnicodeCategory(chr) == UnicodeCategory.OtherLetter || char.GetUnicodeCategory(chr) == UnicodeCategory.DecimalDigitNumber || char.GetUnicodeCategory(chr) == UnicodeCategory.UppercaseLetter || char.GetUnicodeCategory(chr) == UnicodeCategory.LowercaseLetter); } else { return(ALLOWED_CHARACTER.Contains(chr)); } }
public static string ConvertStringForFilename(string input, ValidityMode vmode = ValidityMode.AllowWhitelist) { var output = new StringBuilder(input.Length); foreach (var c in input) { if (c == CONVERT_ESCAPE_CHARACTER) { output.Append(CONVERT_ESCAPE_CHARACTER); output.Append($"{(int) c:X4}"); } else if (IsValidChar(c, vmode)) { output.Append(c); } else { output.Append(CONVERT_ESCAPE_CHARACTER); output.Append($"{(int) c:X4}"); } } var fileName = output.ToString(); if (fileName.EndsWith(".")) { fileName = fileName.Substring(0, fileName.Length - 1) + CONVERT_ESCAPE_CHARACTER + $"{(int) '.':X4}"; } if (RESERVED_FILENAMES.Any(r => string.Equals(r, fileName, StringComparison.CurrentCultureIgnoreCase))) { fileName = CONVERT_ESCAPE_CHARACTER + $"{(int) fileName[0]:X4}" + fileName.Substring(1); } return(fileName); }