Я хотел бы знать, как определить, является ли строка путем правильного файла.
Путь к файлу может или не может существовать.
На 100% точная проверка формата строки пути довольно сложна, поскольку он зависит от файловой системы, в которой он используется (и сетевых протоколов, если они не на одном компьютере).
Даже внутри windows или даже NTFS это не так просто, поскольку все еще зависит от API .NET, используемого в фоновом режиме для взаимодействия с ядром.
А поскольку большинство файловых систем сегодня поддерживают юникод, может также потребоваться проверка всех правил правильного кодирования юникода, нормализации и т.д. и т.п.
Я бы сделал только базовые проверки, а затем правильно обрабатывал исключения, когда путь используется. Возможные правила см. в:
Статический класс System.IO.Path может делать то, что вы просите.
Я нашел это на regexlib.com ( http://regexlib.com/REDetails.aspx?regexp_id=345 ) Дмитрия Борисова.
«Средство проверки имени файла. Проверяет как UNC (\ server \ share \ file), так и обычный путь к MS (c: \ file)»
^(([a-zA-Z]:|\\)\\)?(((\.)|(\.\.)|([^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?))\\)*[^\\/:\*\?"\|<>\. ](([^\\/:\*\?"\|<>\. ])|([^\\/:\*\?"\|<>]*[^\\/:\*\?"\|<>\. ]))?$
Запустите его с помощью Regex.IsMatch, и вы получите логическое значение, указывающее, действительный или нет. Я думаю, что регулярные выражения - это правильный выбор, поскольку файл может не существовать.
Вы можете использовать конструктор FileInfo. Он выбросит ArgumentException, если "Имя файла пустое, содержит только белые пробелы, или содержит недопустимые символы." Он также может выбросить SecurityException или UnauthorizedAccessException, которые, я думаю, можно игнорировать, если вас волнует только формат.
Другой вариант - проверить Path.GetInvalidPathChars напрямую. Например:
boolean possiblePath = pathString.IndexOfAny(Path.GetInvalidPathChars()) == -1;
Вы не можете быть уверены, пока не попытаетесь создать этот файл. Возможно, путь правильный, но настройки безопасности не позволяют создать файл. Единственный экземпляр, который мог бы сказать вам, является ли путь ДЕЙСТВИТЕЛЬНО действительным, - это ОС, так почему бы вам не попытаться создать этот файл и уловить IOException
, который указывает, что он недействителен. ? По моему скромному мнению, это подход: предположить, что ввод действителен, использовать его и поймать IOException
, когда он недействителен.
Вот некоторые вещи, которые вы можете использовать:
Path.IsPathRooted
, чтобы убедиться, что это не относительный путь, а затем используйте диски из Environment.GetLogicalDrives()
, чтобы узнать, содержит ли ваш путь один из допустимых дисков. Path.GetInvalidFileNameChars()
и Path.GetInvalidPathChars()
, которые не полностью перекрываются. Вы также можете использовать Path.GetDirectoryName(path)
и Path.GetFileName(fileName)
с вашим входным именем, что вызовет исключение, если параметр path содержит недопустимые символы, пуст или содержит только белые пробелы.
Вы пробовали регулярные выражения?
^([a-zA-Z]\:)(\\[^\\/:*?<>"|]*(?<![ ]))*(\.[a-zA-Z]{2,6})$
должно работать