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?

4voto

Gark Garcia Punkte 370

Es gibt viele gute Lösungen, aber keine von ihnen prüft, ob der Pfad in einer vorhandenes Laufwerk Hier ist ein weiterer:

private bool IsValidPath(string path)
{
    // Check if the path is rooted in a driver
    if (path.Length < 3) return false;
    Regex driveCheck = new Regex(@"^[a-zA-Z]:\\$");
    if (!driveCheck.IsMatch(path.Substring(0, 3))) return false;

    // Check if such driver exists
    IEnumerable<string> allMachineDrivers = DriveInfo.GetDrives().Select(drive => drive.Name);
    if (!allMachineDrivers.Contains(path.Substring(0, 3))) return false;

    // Check if the rest of the path is valid
    string InvalidFileNameChars = new string(Path.GetInvalidPathChars());
    InvalidFileNameChars += @":/?*" + "\"";
    Regex containsABadCharacter = new Regex("[" + Regex.Escape(InvalidFileNameChars) + "]");
    if (containsABadCharacter.IsMatch(path.Substring(3, path.Length - 3)))
        return false;
    if (path[path.Length - 1] == '.') return false;

    return true;
}

Diese Lösung ist no relative Pfade zu berücksichtigen.

1voto

Martijn Punkte 11548

Am nächsten bin ich dem gekommen, indem ich versucht habe, es zu schaffen und zu sehen, ob es gelingt.

1voto

Umesh CHILAKA Punkte 1456

Holt die ungültigen Zeichen aus System.IO.Path.GetInvalidPathChars(); und prüfen Sie, ob Ihr String (Verzeichnispfad) diese enthält oder nicht.

1voto

ultramegaok Punkte 131

Dies akzeptiert einen Pfad, der auch einem gültigen relativen Pfad entsprechen könnte

string path = "yourPath";
bool pathIsValid = null;
try
{ 
    Path.GetFullPath(path);
    pathIsValid = true;
}
catch
{
    pathIsValid = false;
}

-1voto

Ghislain Zabatio Punkte 123
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;
}

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