131 Stimmen

Prüfen, ob ein Pfad gültig ist

Ich frage mich nur: Ich bin auf der Suche nach einer Möglichkeit, zu überprüfen, ob ein bestimmter Pfad gültig ist. (Hinweis: Ich möchte nicht prüfen, ob eine Datei vorhanden ist! Ich möchte nur die Gültigkeit des Pfades überprüfen - also ob eine Datei an diesem Ort existieren könnte) .

Das Problem ist, dass ich in der .Net API nichts finden kann. Aufgrund der vielen Formate und Speicherorte, die Windows unterstützt, würde ich lieber etwas MS-eigenes verwenden.

Da die Funktion in der Lage sein sollte, gegen zu prüfen:

  • Relative Pfade (./)
  • Absolute Pfade (c: \tmp )
  • UNC-Pathes ( \some -pc \c $)
  • NTFS-Beschränkungen wie der volle Pfad mit 1024 Zeichen - Wenn ich mich nicht irre, macht eine Überschreitung des Pfades eine Datei für viele unzugänglich Windows-interne Funktionen. Das Umbenennen mit dem Explorer funktioniert trotzdem
  • Volume-GUID-Pfade: "\? \Volume {GUID} \somefile.foo

Hat jemand eine solche Funktion?

67voto

abatishchev Punkte 94886

Versuchen Sie Uri.IsWellFormedUriString() :

  • Die Zeichenkette ist nicht korrekt escaped.

      http://www.example.com/path???/file name
  • Die Zeichenfolge ist ein absoluter Uri, der einen impliziten Datei-Uri darstellt.

      c:\\directory\filename
  • Die Zeichenfolge ist ein absoluter URI, dem ein Schrägstrich vor dem Pfad fehlt.

      file://c:/directory/filename
  • Die Zeichenkette enthält uneingekapselte Backslashes, auch wenn diese als Schrägstriche behandelt werden.

      http:\\host/path/file
  • Die Zeichenkette stellt eine hierarchische absolute Uri dar und enthält kein "://".

      www.example.com/path/file
  • Der Parser für die Uri.Scheme zeigt an, dass die ursprüngliche Zeichenkette nicht wohlgeformt war.

      The example depends on the scheme of the URI.

31voto

Patko Punkte 4275

13voto

Dao Seeker Punkte 184

Ich hatte keine Probleme mit dem unten stehenden Code. (Relative Pfade müssen mit '/' oder '\' beginnen).

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

Diese würden zum Beispiel false zurückgeben:

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

Und diese würden true zurückgeben:

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

6voto

Alex Jolig Punkte 12486
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;
}

6voto

Nimrod Punkte 153

Sie können diesen Code ausprobieren:

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

Ich bin mir nicht sicher, ob es alle Fälle abdeckt...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X