Мне нужен надежный и простой способ удаления недопустимых путей и символов файла из простой строки. Я использовал приведенный ниже код, но он, похоже, ничего не делает, что мне не хватает?
using System; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string illegal = "\"M<>\"\\a/ry/ h**ad:>> a\\/:*?\"<>| li*tt|le|| la\"mb.?"; illegal = illegal.Trim(Path.GetInvalidFileNameChars()); illegal = illegal.Trim(Path.GetInvalidPathChars()); Console.WriteLine(illegal); Console.ReadLine(); } } }
Это, кажется, O (n) и не тратит слишком много памяти на строки:
private static readonly HashSet<char> invalidFileNameChars = new HashSet<char>(Path.GetInvalidFileNameChars()); public static string RemoveInvalidFileNameChars(string name) { if (!name.Any(c => invalidFileNameChars.Contains(c))) { return name; } return new string(name.Where(c => !invalidFileNameChars.Contains(c)).ToArray()); }
public static bool IsValidFilename(string testName) { return !new Regex("[" + Regex.Escape(new String(System.IO.Path.GetInvalidFileNameChars())) + "]").IsMatch(testName); }
Я создал метод расширения, который объединяет несколько предложений:
Источник:
public static class FileNameCorrector { private static HashSet<char> invalid = new HashSet<char>(Path.GetInvalidFileNameChars()); public static string ToValidFileName(this string name, char replacement = '\0') { var builder = new StringBuilder(); foreach (var cur in name) { if (cur > 31 && cur < 128 && !invalid.Contains(cur)) { builder.Append(cur); } else if (replacement != '\0') { builder.Append(replacement); } } return builder.ToString(); } }
думаю на вопрос уже не полный ответ ... Ответы только описывают чистое имя файла ИЛИ путь ... не оба. Вот мое решение:
private static string CleanPath(string path) { string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch))); List<string> split = path.Split('\\').ToList(); string returnValue = split.Aggregate(string.Empty, (current, s) => current + (r.Replace(s, "") + @"\")); returnValue = returnValue.TrimEnd('\\'); return returnValue; }
Это действительно нужно, чтобы вы хотели, и избежать столкновений
static string SanitiseFilename(string key) { var invalidChars = Path.GetInvalidFileNameChars(); var sb = new StringBuilder(); foreach (var c in key) { var invalidCharIndex = -1; for (var i = 0; i < invalidChars.Length; i++) { if (c == invalidChars[i]) { invalidCharIndex = i; } } if (invalidCharIndex > -1) { sb.Append("_").Append(invalidCharIndex); continue; } if (c == '_') { sb.Append("__"); continue; } sb.Append(c); } return sb.ToString(); }
Или вы можете просто сделать
[YOUR STRING].Replace('\\', ' ').Replace('/', ' ').Replace('"', ' ').Replace('*', ' ').Replace(':', ' ').Replace('?', ' ').Replace('<', ' ').Replace('>', ' ').Replace('|', ' ').Trim();