Александр Пузанов Asked:2020-08-04 16:40:28 +0000 UTC2020-08-04 16:40:28 +0000 UTC 2020-08-04 16:40:28 +0000 UTC 如何检查创建的文件名的正确性? 772 有一行用户指定了要创建的文件的名称。需要检查名称的正确性。如果有无效字符,则替换它们,例如用“_”。尝试不起作用,因为 创建文件时出现异常的原因有很多(硬盘上没有空间,在这个目录下没有创建权限等)。如何检查名称是否正确? c# 3 个回答 Voted MSDN.WhiteKnight 2020-08-08T14:07:33Z2020-08-08T14:07:33Z 像这样的东西 /// <summary> /// Проверка корректности имени файла /// </summary> /// <param name="name">Проверяемое имя</param> public static bool ValidateFileName(string name) { try { FileStream fs = File.Open(name, FileMode.Open); if (fs != null) fs.Close(); } catch (ArgumentException) { return false;//имя файла введено некорректно } catch (FileNotFoundException) { return true;//имя файла введено корректно, но файл не существует } catch (IOException) { return true;//имя файла введено корректно, но файл недоступен } return true;//имя файла введено корректно } /// <summary> /// Проверка корректности имени файла с предложением исправленного имени /// </summary> /// <param name="name">Проверяемое имя</param> /// <param name="corrected_name">Предлагаемое исправленное имя</param> public static bool ValidateFileName(string name,out string corrected_name) { try { FileStream fs = File.Open(name, FileMode.Open); if (fs != null) fs.Close(); } catch (ArgumentException)//имя файла введено некорректно { //пытаемся исправить имя char[] banned = System.IO.Path.GetInvalidFileNameChars(); StringBuilder sb = new StringBuilder(); foreach (char c in name) { if (banned.Contains(c)) sb.Append('_'); else sb.Append(c); } if (ValidateFileName(sb.ToString()) != false) { //удалось исправить имя corrected_name = sb.ToString(); } else corrected_name = "";//не удалось исправить имя (видимо это зарезервированное имя типа CON) return false; } catch (FileNotFoundException) { corrected_name = ""; return true;//имя файла введено корректно, но файл не существует } catch (IOException) { corrected_name = ""; return true;//имя файла введено корректно, но файл недоступен } corrected_name = ""; return true;//имя файла введено корректно } 但实际上,在桌面应用程序中,最好不要这样做,而是使用启用验证的 SaveFileDialog 来输入名称。所以它主要用于服务或 Web 应用程序。 Best Answer Иван К 2020-08-10T19:03:58Z2020-08-10T19:03:58Z 对于我自己,我做了这个扩展方法: /// <summary> /// удаляет все символы которые не разрешены в именах файлов /// </summary> /// <param name="file_name"></param> /// <returns></returns> public static String RemoveInvalidChars(this String file_name) { foreach (Char invalid_char in Path.GetInvalidFileNameChars()) { file_name = file_name.Replace(oldValue: invalid_char.ToString(), newValue: ""); } return file_name; } 您可以将您选择的字符添加到 newValue 参数 如果你想要一行,那么你可以这样做: String new_file_name = Path.GetInvalidFileNameChars().Aggregate(invalid_file_name, (current, invalid_char) => current.Replace(invalid_char.ToString(), "_")); sp7 2020-08-08T20:58:57Z2020-08-08T20:58:57Z 检查文件名或路径中没有指定无效字符可以这样完成: private static bool IsValidFilename(string fileName) { var invalidChars = string.Join("", Path.GetInvalidFileNameChars()); var regex = new Regex("[" + Regex.Escape(string.Join("", invalidChars)) + "]"); return !regex.IsMatch(fileName); } private static bool IsValidFilePath(string path) { var invalidChars = string.Join("", Path.GetInvalidPathChars()); var regex = new Regex("[" + Regex.Escape(string.Join("", invalidChars)) + "]"); return !regex.IsMatch(path); } static void Main(string[] args) { foreach (var invalidFileNameChar in Path.GetInvalidFileNameChars()) { var name = "Имя" + invalidFileNameChar; Console.WriteLine($"{name} --> {IsValidFileName(name)}"); } Console.WriteLine(new string('-', 40)); foreach (var invalidFilePathChar in Path.GetInvalidPathChars()) { var path = @"C:\my.txt" + invalidFilePathChar; Console.WriteLine($"{path} --> {IsValidFilePath(path)}"); } }
像这样的东西
但实际上,在桌面应用程序中,最好不要这样做,而是使用启用验证的 SaveFileDialog 来输入名称。所以它主要用于服务或 Web 应用程序。
对于我自己,我做了这个扩展方法:
您可以将您选择的字符添加到 newValue 参数
如果你想要一行,那么你可以这样做:
检查文件名或路径中没有指定无效字符可以这样完成: