it-swarm.com.de

Prüfen Sie, ob ein Pfad gültig ist

Ich frage mich nur: Ich suche nach einem Weg, um zu überprüfen, ob ein angegebener Pfad gültig ist .(Hinweis: Ich möchte nicht prüfen, ob eine Datei vorhanden ist!) Pfad - Wenn also möglicherweise eine Datei am Speicherort vorhanden ist).

Das Problem ist, dass ich nichts in der .NET-API finden kann. Aufgrund der vielen von Windows unterstützten Formate und Speicherorte möchte ich lieber etwas MS-natives verwenden.

Da sollte die Funktion gegen prüfen können:

  • Relative Pfade (./)
  • Absolute Pfade (c:\tmp)
  • UNC-Pfade (\ some-pc\c $)
  • NTFS-Einschränkungen wie der vollständige Pfad 1024 Zeichen - Wenn ich mich nicht irre, wenn Sie den Pfad überschreiten, wird eine Datei für viele nicht zugänglich interne Windows-Funktionen. Das Umbenennen mit dem Explorer funktioniert immer noch
  • Volume GUID Pfade: "\?\Volume {GUID}\somefile.foo

Hat jemand eine Funktion wie diese?

91
Corelgott

Versuchen Sie Uri.IsWellFormedUriString() :

  • Die Zeichenfolge wird nicht korrekt mit Escapezeichen versehen.

    http://www.example.com/path???/file name
    
  • Die Zeichenfolge ist ein absoluter Uri, der eine implizite 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 Zeichenfolge enthält unverschobene Backslashes, auch wenn sie als Schrägstrich behandelt werden.

    http:\\Host/path/file
    
  • Die Zeichenfolge stellt einen hierarchischen absoluten Uri dar und enthält kein ": //".

    www.example.com/path/file
    
  • Der Parser für das Uri.Scheme zeigt an, dass die ursprüngliche Zeichenfolge nicht ordnungsgemäß geformt wurde.

    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

Ich habe keine Probleme mit dem Code unten. (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;
}

Zum Beispiel würden diese falsch 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 wahr zurückkehren:

IsValidPath(@"C:\\abc");
IsValidPath(@"F:\FILES\");
IsValidPath(@"C:\\abc.docx\\defg.docx");
IsValidPath(@"C:/abc/defg");
IsValidPath(@"C:\\\//\/\\/\\\/abc/\/\/\/\///\\\//\defg");
IsValidPath(@"C:/abc/def~`[email protected]#$%^&()_-+={[}];',.g");
IsValidPath(@"C:\\\\\abc////////defg");
IsValidPath(@"/abc", true);
IsValidPath(@"\abc", true);
6
Dao Seeker

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

3
Nimrod
2
markpsmith

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

2
Martijn

Rufen Sie die ungültigen Zeichen von System.IO.Path.GetInvalidPathChars(); ab und prüfen Sie, ob Ihre Zeichenfolge (Verzeichnispfad) diese enthält oder nicht.

1
Umesh CHILAKA

Es gibt viele gute Lösungen hier, aber da keine von diesen Optionen vorhanden ist, überprüfen Sie, ob der Pfad in einem bestehenden Laufwerk verankert ist. Hier ist noch eines:

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 berücksichtigt nicht relative Pfade.

0
Gark Garcia