Страницы

Поиск по вопросам

среда, 4 декабря 2019 г.

Как проверить корректность имени создаваемого файла?

#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)}"); } }

Комментариев нет:

Отправить комментарий