Verifique se um caminho é válido

Estou apenas imaginando: estou procurando uma maneira de validar se um determinado caminho é válido. (Nota: Eu não quero verificar se existe um arquivo! Eu só quero provar a validade do caminho – Então, se um arquivo pode existir no local) .

O problema é que não consigo encontrar nada na API do .Net. Devido aos muitos formatos e locais que o Windows suporta, prefiro usar algo MS-native.

Como a function deve ser capaz de verificar:

  • Caminhos Relativos (./)
  • Caminhos Absolutos (c: \ tmp)
  • Caminhos UNC (\ some-pc \ c $)
  • Limitações de NTFS como o caminho completo 1024 caracteres – Se não estou enganado, exceder o caminho tornará um arquivo inacessível para muitas funções internas do Windows. Renomeando-o com o Explorer ainda funciona
  • Caminhos de GUID de volume: “\? \ Volume {GUID} \ somefile.foo

Alguém tem uma function assim?

Tente Uri.IsWellFormedUriString() :

  • A string não está corretamente escapa.

     http://www.example.com/path???/file name 
  • A string é um Uri absoluto que representa um arquivo implícito Uri.

     c:\\directory\filename 
  • A cadeia é um URI absoluto que está faltando uma barra antes do caminho.

     file://c:/directory/filename 
  • A string contém barras invertidas sem escape, mesmo que sejam tratadas como barras.

     http:\\host/path/file 
  • A string representa um Uri absoluto hierárquico e não contém “: //”.

     www.example.com/path/file 
  • O analisador para o Uri.Scheme indica que a cadeia original não estava bem formada.

     The example depends on the scheme of the URI. 

Ou use o FileInfo como sugerido em In C # verifique se o nome do arquivo é possivelmente válido (não que exista) .

 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; } 

Eu não tive nenhum problema com o código abaixo. (Caminhos relativos devem começar com ‘/’ ou ‘\’).

 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; } 

Por exemplo, estes retornariam falso:

 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); 

E estes retornariam verdadeiro:

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

Você pode tentar este código:

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

Não tenho certeza de que cobre todos os casos …

O mais próximo que cheguei foi tentar criá-lo e ver se ele é bem-sucedido.

Directory.Exists

Obtenha os caracteres inválidos de System.IO.Path.GetInvalidPathChars(); e verifique se a sua string (caminho do diretório) contém isso ou não.

 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; } 

Você poderia tentar usar Path.IsPathRooted () em combinação com Path.GetInvalidFileNameChars () para certificar-se de que o caminho está na metade do caminho.