#c_sharp
Есть строка, в которой пользователь указал имя создаваемого файла. Есть необходимость проверить корректность имени. Если есть недопустимые символы, то заменить их, к примеру на "_". try не подходит, т.к. причин исключений при создании файла много (нет места на жестком диске, нет прав на создание в данной директории и т.д.). Подскажите, как проверить корректность имени?
Ответы
Ответ 1
Для себя я сделал вот такой метод расширения: ////// удаляет все символы которые не разрешены в именах файлов /// /// ///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(), "_")); Ответ 2
как-то так ////// Проверка корректности имени файла /// /// Проверяемое имя 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;//имя файла введено корректно } ////// Проверка корректности имени файла с предложением исправленного имени /// /// Проверяемое имя /// Предлагаемое исправленное имя 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 с включенной проверкой корректности. Так что это в основном для служб или веб-приложений.Ответ 3
Проверку что не указано недопустимых символов в имени файла или пути можно сделать так: 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)}"); } }
Комментариев нет:
Отправить комментарий