web-dev-qa-db-fra.com

Vérifier si un chemin est valide

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?

91
Corelgott

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.
    
57
abatishchev
26
Patko
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;
}
7
Alex Jolig

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);
6
Dao Seeker

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 ...

3
Nimrod
2
markpsmith

Le plus proche que je sois venu est d’essayer de le créer et de voir s’il réussit.

2
Martijn

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.

1
Umesh CHILAKA