Vérifier si un chemin est valide

Je me demande simplement: je cherche un moyen de valider si un chemin donné est valide. (Note: je ne veux pas vérifier si un fichier existe! Je veux seulement vérifier la validité du chemin – Donc, si un fichier peut éventuellement exister à l’emplacement) .

Le problème est que je ne trouve rien dans l’API .Net. En raison des nombreux formats et emplacements pris en charge par Windows, je préfère utiliser quelque chose de MS-native.

Puisque la fonction devrait être capable de vérifier:

  • Chemins relatifs (./)
  • Chemin absolu (c: \ tmp)
  • UNC-Pathes (\ some-pc \ c $)
  • Limitations NTFS comme le chemin complet 1024 caractères – Si je ne me trompe pas, le chemin rendra un fichier inaccessible pour de nombreuses fonctions Windows internes. Le renommer avec Explorer fonctionne toujours
  • Chemins de volume GUID: “\? \ Volume {GUID} \ somefile.foo

Est-ce que quelqu’un a une fonction comme ça?

Ou utilisez FileInfo comme suggéré dans In C #, vérifiez que le nom de fichier est éventuellement valide (pas qu’il existe) .

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

Je n’ai eu aucun problème avec le code ci-dessous. (Les chemins relatifs doivent commencer par ‘/’ ou ‘\’).

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

Par exemple, ils retourneraient faux:

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

Et ceux-ci retourneraient vrai:

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

Vous pouvez essayer ce code:

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

Je ne suis pas sûr que cela couvre tous les cas …

Le plus proche de moi est en essayant de le créer et de voir si cela réussit.

Directory.Exists?

Récupère les caractères non valides de System.IO.Path.GetInvalidPathChars(); et vérifiez si votre chaîne (chemin de répertoire) les contient ou non.

 private bool IsValidPath(ssortingng path) { Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$"); if (ssortingng.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; } 

Vous pouvez essayer d’utiliser Path.IsPathRooted () en combinaison avec Path.GetInvalidFileNameChars () pour vous assurer que le chemin est à mi-chemin.