Проверьте правильность пути

Мне просто интересно: я ищу способ проверить правильность данного пути. (Примечание: я не хочу проверять, существует ли файл! Я только хочу проверить правильность пути – так что если файл может существовать в этом месте) .

Проблема в том, что я ничего не могу найти в API .Net. Из-за множества форматов и мест, поддерживаемых Windows, я бы предпочел использовать что-то MS-native.

Поскольку функция должна быть в состоянии проверить:

  • Относительные пути (./)
  • Абсолютные пути (c: \ tmp)
  • UNC-Pathes (\ some-pc \ c $)
  • Ограничения NTFS, такие как полный путь 1024 символов. Если я не ошибаюсь, превышение пути сделает файл недоступным для многих внутренних функций Windows. Переименование его с помощью Explorer все еще работает
  • Тома GUID-пути: “\? \ Volume {GUID} \ somefile.foo

У кого-нибудь есть такая функция?

Попробуйте Uri.IsWellFormedUriString() :

  • Строка неверно экранирована.

     http://www.example.com/path???/file name 
  • Строка является абсолютным Uri, который представляет собой неявный файл Uri.

     c:\\directory\filename 
  • Строка является абсолютным URI, который пропускает косую черту перед контуром.

     file://c:/directory/filename 
  • Строка содержит необменимые обратные косые черты, даже если они рассматриваются как косые черты.

     http:\\host/path/file 
  • Строка представляет собой иерархический абсолютный Uri и не содержит «: //».

     www.example.com/path/file 
  • Парсер для Uri.Scheme указывает, что исходная строка не была правильно сформирована.

     The example depends on the scheme of the URI. 

Или используйте FileInfo, как показано в In C #, проверьте, что имя файла возможно (не существует) .

 private bool IsValidPath(string path) { Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$"); if (!driveCheck.IsMatch(path.Substring(0, 3))) return false; string strTheseAreInvalidFileNameChars = new string(Path.GetInvalidPathChars()); strTheseAreInvalidFileNameChars += @":/?*" + "\""; Regex containsABadCharacter = new Regex("[" + Regex.Escape(strTheseAreInvalidFileNameChars) + "]"); if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3))) return false; DirectoryInfo dir = new DirectoryInfo(Path.GetFullPath(path)); if (!dir.Exists) dir.Create(); return true; } 

У меня не было проблем с кодом ниже. (Относительные пути должны начинаться с ‘/’ или ‘\’).

 private bool IsValidPath(string path, bool allowRelativePaths = false) { bool isValid = true; try { string fullPath = Path.GetFullPath(path); if (allowRelativePaths) { isValid = Path.IsPathRooted(path); } else { string root = Path.GetPathRoot(path); isValid = string.IsNullOrEmpty(root.Trim(new char[] { '\\', '/' })) == false; } } catch(Exception ex) { isValid = false; } return isValid; } 

Например, они вернут false:

 IsValidPath("C:/abc*d"); IsValidPath("C:/abc?d"); IsValidPath("C:/abc\"d"); IsValidPath("C:/abcd"); IsValidPath("C:/abc|d"); IsValidPath("C:/abc:d"); IsValidPath(""); IsValidPath("./abc"); IsValidPath("./abc", true); IsValidPath("/abc"); IsValidPath("abc"); IsValidPath("abc", true); 

И это вернет истину:

 IsValidPath(@"C:\\abc"); IsValidPath(@"F:\FILES\"); IsValidPath(@"C:\\abc.docx\\defg.docx"); IsValidPath(@"C:/abc/defg"); IsValidPath(@"C:\\\//\/\\/\\\/abc/\/\/\/\///\\\//\defg"); IsValidPath(@"C:/abc/def~`[email protected]#$%^&()_-+={[}];',.g"); IsValidPath(@"C:\\\\\abc////////defg"); IsValidPath(@"/abc", true); IsValidPath(@"\abc", true); 

Вы можете попробовать этот код:

 try { Path.GetDirectoryName(myPath); } catch { // Path is not valid } 

Я не уверен, что он охватывает все случаи …

Ближе всего я пришел, пытаясь создать его и посмотреть, удастся ли ему это сделать.

Directory.Exists?

Получить недопустимые символы из System.IO.Path.GetInvalidPathChars(); и проверьте, содержит ли ваша строка (путь к каталогу) эти или нет.

 private bool IsValidPath(string path) { Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$"); if (string.IsNullOrWhiteSpace(path) || path.Length < 3) { return false; } if (!driveCheck.IsMatch(path.Substring(0, 3))) { return false; } var x1 = (path.Substring(3, path.Length - 3)); string strTheseAreInvalidFileNameChars = new string(Path.GetInvalidPathChars()); strTheseAreInvalidFileNameChars += @":?*"; Regex containsABadCharacter = new Regex("[" + Regex.Escape(strTheseAreInvalidFileNameChars) + "]"); if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3))) { return false; } var driveLetterWithColonAndSlash = Path.GetPathRoot(path); if (!DriveInfo.GetDrives().Any(x => x.Name == driveLetterWithColonAndSlash)) { return false; } return true; } 

Вы можете попробовать использовать Path.IsPathRooted () в сочетании с Path.GetInvalidFileNameChars (), чтобы убедиться, что путь на полпути в порядке.

  • Получить текущую позицию курсора
  • Вызов метода API Win32 из Java
  • Как использовать FolderBrowserDialog из приложения WPF
  • Запуск процесса мониторинга в системе
  • Динамически загружать функцию из DLL
  • C # эквивалент DllMain в C (WinAPI)
  • Есть ли недостатки в использовании UPX для сжатия исполняемого файла Windows?
  • Как я могу установить разные тексты подсказок для каждого элемента в списке?
  • Delphi - получить, какие файлы открываются приложением
  • Что такое __stdcall?
  • Возможно ли «декомпилировать» Windows .exe? Или, по крайней мере, рассмотреть Ассамблею?
  • Давайте будем гением компьютера.