Определите через C#, является ли строка путем правильного файла

Я хотел бы знать, как определить, является ли строка путем правильного файла.

Путь к файлу может или не может существовать.

44
задан DavidRR 8 December 2016 в 19:48
поделиться

7 ответов

На 100% точная проверка формата строки пути довольно сложна, поскольку он зависит от файловой системы, в которой он используется (и сетевых протоколов, если они не на одном компьютере).

Даже внутри windows или даже NTFS это не так просто, поскольку все еще зависит от API .NET, используемого в фоновом режиме для взаимодействия с ядром.

А поскольку большинство файловых систем сегодня поддерживают юникод, может также потребоваться проверка всех правил правильного кодирования юникода, нормализации и т.д. и т.п.

Я бы сделал только базовые проверки, а затем правильно обрабатывал исключения, когда путь используется. Возможные правила см. в:

22
ответ дан 26 November 2019 в 21:58
поделиться

Статический класс System.IO.Path может делать то, что вы просите.

-1
ответ дан 26 November 2019 в 21:58
поделиться

Я нашел это на regexlib.com ( http://regexlib.com/REDetails.aspx?regexp_id=345 ) Дмитрия Борисова.

«Средство проверки имени файла. Проверяет как UNC (\ server \ share \ file), так и обычный путь к MS (c: \ file)»

^(([a-zA-Z]:|\\)\\)?(((\.)|(\.\.)|([^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?))\\)*[^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?$

Запустите его с помощью Regex.IsMatch, и вы получите логическое значение, указывающее, действительный или нет. Я думаю, что регулярные выражения - это правильный выбор, поскольку файл может не существовать.

0
ответ дан 26 November 2019 в 21:58
поделиться

Вы можете использовать конструктор FileInfo. Он выбросит ArgumentException, если "Имя файла пустое, содержит только белые пробелы, или содержит недопустимые символы." Он также может выбросить SecurityException или UnauthorizedAccessException, которые, я думаю, можно игнорировать, если вас волнует только формат.

Другой вариант - проверить Path.GetInvalidPathChars напрямую. Например:

boolean possiblePath = pathString.IndexOfAny(Path.GetInvalidPathChars()) == -1;
56
ответ дан 26 November 2019 в 21:58
поделиться

Вы не можете быть уверены, пока не попытаетесь создать этот файл. Возможно, путь правильный, но настройки безопасности не позволяют создать файл. Единственный экземпляр, который мог бы сказать вам, является ли путь ДЕЙСТВИТЕЛЬНО действительным, - это ОС, так почему бы вам не попытаться создать этот файл и уловить IOException , который указывает, что он недействителен. ? По моему скромному мнению, это подход: предположить, что ввод действителен, использовать его и поймать IOException , когда он недействителен.

4
ответ дан 26 November 2019 в 21:58
поделиться

Вот некоторые вещи, которые вы можете использовать:

  • Для проверки правильности диска (например, на одном компьютере диск X:\ существует, а на вашем нет): используйте Path.IsPathRooted, чтобы убедиться, что это не относительный путь, а затем используйте диски из Environment.GetLogicalDrives(), чтобы узнать, содержит ли ваш путь один из допустимых дисков.
  • Чтобы проверить наличие допустимых символов, у вас есть два метода: Path.GetInvalidFileNameChars() и Path.GetInvalidPathChars(), которые не полностью перекрываются. Вы также можете использовать Path.GetDirectoryName(path) и Path.GetFileName(fileName) с вашим входным именем, что вызовет исключение, если

параметр path содержит недопустимые символы, пуст или содержит только белые пробелы.

8
ответ дан 26 November 2019 в 21:58
поделиться

Вы пробовали регулярные выражения?

^([a-zA-Z]\:)(\\[^\\/:*?<>"|]*(?<![ ]))*(\.[a-zA-Z]{2,6})$

должно работать

2
ответ дан 26 November 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: