Je me demande simplement: je cherche un moyen de valider si un chemin donné est valide . (Remarque: je ne veux pas vérifier si un fichier existe déjà! Je veux seulement prouver la validité du chemin - Donc, si un fichier peut éventuellement exister à l’emplacement) .
Le problème, c’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 en MS-native.
Puisque la fonction devrait pouvoir vérifier contre:
- Chemins relatifs (./)
- Chemins absolus (c:\tmp)
- Chemins UNC (\ some-pc\c $)
- Limitations NTFS telles que le chemin complet 1024 caractères - Si je ne me trompe pas, dépasser le chemin rendra un fichier inaccessible pour beaucoup fonctions internes de Windows. Le renommer avec Explorer fonctionne toujours
- Volume GUID Chemins d’accès: "\?\Volume {GUID}\somefile.foo
Est-ce que quelqu'un a une fonction comme celle-ci?
Essayez Uri.IsWellFormedUriString()
:
La chaîne n'est pas correctement échappée.
http://www.example.com/path???/file name
La chaîne est un Uri absolu qui représente un fichier Uri implicite.
c:\\directory\filename
La chaîne est un URI absolu auquel il manque une barre oblique avant le chemin.
file://c:/directory/filename
La chaîne contient des barres obliques inverses non échappées, même si elles sont traitées comme des barres obliques.
http:\\Host/path/file
La chaîne représente un Uri absolu hiérarchique et ne contient pas ": //".
www.example.com/path/file
L'analyseur pour Uri.Scheme indique que la chaîne d'origine n'était pas bien formée.
The example depends on the scheme of the URI.
Ou utilisez les FileInfo comme suggéré dans En C #, vérifiez que le nom du fichier est éventuellement valide (même s'il existe) .
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;
}
Je n'ai pas eu de problèmes avec le code ci-dessous. (Les chemins relatifs doivent commencer par '/' 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;
}
Par exemple, ils renverraient false:
IsValidPath("C:/abc*d");
IsValidPath("C:/abc?d");
IsValidPath("C:/abc\"d");
IsValidPath("C:/abc<d");
IsValidPath("C:/abc>d");
IsValidPath("C:/abc|d");
IsValidPath("C:/abc:d");
IsValidPath("");
IsValidPath("./abc");
IsValidPath("./abc", true);
IsValidPath("/abc");
IsValidPath("abc");
IsValidPath("abc", true);
Et ceux-ci reviendraient vrais:
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 que je sois venu est d’essayer de le créer et de voir s’il réussit.
Obtenez les caractères invalides de System.IO.Path.GetInvalidPathChars();
et vérifiez si votre chaîne (chemin du répertoire) les contient ou non.