Frage Überprüfen Sie, ob der vollständige Pfad angegeben wurde


Gibt es eine Methode, um zu überprüfen, ob der angegebene Pfad der vollständige Pfad ist? Genau jetzt mache ich das:

if (template.Contains(":\\")) //full path already given
{
}
else //calculate the path from local assembly
{
}

Aber muss es eleganter sein, dies zu überprüfen?


75
2018-04-06 10:41


Ursprung


Antworten:


Versuchen Sie es mit System.IO.Path.IsPathRooted? Es kehrt auch zurück true für absolute Pfade.

System.IO.Path.IsPathRooted(@"c:\foo"); // true
System.IO.Path.IsPathRooted(@"\foo"); // true
System.IO.Path.IsPathRooted("foo"); // false

System.IO.Path.IsPathRooted(@"c:1\foo"); // surprisingly also true
System.IO.Path.GetFullPath(@"c:1\foo");// returns "[current working directory]\1\foo"

109
2018-04-06 10:43



Path.IsPathRooted(path)
&& !Path.GetPathRoot(path).Equals(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal)

Die obige Bedingung:

  • erfordert keine Dateisystemberechtigungen
  • kehrt zurück false In den meisten Fällen, wo das Format von path ist ungültig (anstatt eine Ausnahme auszulösen)
  • kehrt zurück true nur wenn path enthält das Volumen

In Szenarien wie dem vom OP gestellten kann es daher geeigneter sein als die Bedingungen in den früheren Antworten. Im Gegensatz zur obigen Bedingung:

  • path == System.IO.Path.GetFullPath(path) löst Ausnahmen aus und kehrt nicht zurück false in diesen Szenarien:
    • Der Aufrufer verfügt nicht über die erforderlichen Berechtigungen
    • Das System konnte den absoluten Pfad nicht abrufen
    • path enthält einen Doppelpunkt (":"), der nicht Teil einer Datenträger-ID ist
    • Der angegebene Pfad, Dateiname oder beide überschreiten die vom System definierte maximale Länge
  • System.IO.Path.IsPathRooted(path) kehrt zurück true ob path beginnt mit einem einzelnen Verzeichnistrennzeichen.

Schließlich ist hier eine Methode, die die obige Bedingung umschließt und auch die verbleibenden möglichen Ausnahmen ausschließt:

public static bool IsFullPath(string path) {
    return !String.IsNullOrWhiteSpace(path)
        && path.IndexOfAny(System.IO.Path.GetInvalidPathChars().ToArray()) == -1
        && Path.IsPathRooted(path)
        && !Path.GetPathRoot(path).Equals(Path.DirectorySeparatorChar.ToString(), StringComparison.Ordinal);
}

EDIT: EM0 machte einen guten Kommentar und alternative Antwort den seltsamen Fall von Pfaden wie C: und C:dir. Um zu entscheiden, wie Sie mit solchen Pfaden umgehen möchten, sollten Sie einen tiefgehenden Tauchgang zu MSDN -> durchführen Windows-Desktop-Anwendungen -> Entwickeln -> Desktop-Technologien -> Datenzugriff und Speicherung -> Lokale Dateisysteme -> Dokumentenverwaltung -> Über Dateiverwaltung -> Erstellen, Löschen und Verwalten von Dateien -> Benennen von Dateien, Pfaden und Namespaces -> Vollständig qualifiziert gegenüber relativen Pfaden

Für Windows-API-Funktionen, die Dateien bearbeiten, können Dateinamen häufig verwendet werden   relativ zum aktuellen Verzeichnis sein, während einige APIs vollständig benötigen   qualifizierter Pfad Ein Dateiname ist relativ zu dem aktuellen Verzeichnis, wenn er dies ist   beginnt nicht mit einem der folgenden Punkte:

  • Ein UNC-Name eines beliebigen Formats, der immer mit zwei Backslash-Zeichen ("\") beginnt. Weitere Informationen finden Sie im nächsten Abschnitt.
  • Ein Disk-Bezeichner mit einem Backslash, zum Beispiel "C: \" oder "d: \".
  • Ein einzelner umgekehrter Schrägstrich, z. B. "\ Verzeichnis" oder "\ Datei.txt". Dies wird auch als absoluter Pfad bezeichnet.

Wenn ein Dateiname mit nur einem Festplattenbezeichner beginnt, aber nicht mit dem   Backslash nach dem Doppelpunkt, wird als relativer Pfad zu den   aktuelles Verzeichnis auf dem Laufwerk mit dem angegebenen Buchstaben. Beachten Sie, dass   Das aktuelle Verzeichnis kann das Stammverzeichnis sein oder nicht   auf was es im letzten "change directory" eingestellt wurde   Operation auf dieser Festplatte. Beispiele für dieses Format sind:

  • "C: tmp.txt" verweist auf eine Datei mit Name "tmp.txt" in dem aktuellen Verzeichnis auf Laufwerk C.
  • "C: tempdir \ tmp.txt" verweist auf eine Datei in einem Unterverzeichnis zu dem aktuellen Verzeichnis auf Laufwerk C.

[...]


16
2018-01-27 19:34



Versuchen

System.IO.Path.IsPathRooted(template)

Funktioniert sowohl für UNC-Pfade als auch für lokale.

Z.B.

Path.IsPathRooted(@"\\MyServer\MyShare\MyDirectory")  // returns true
Path.IsPathRooted(@"C:\\MyDirectory")  // returns true

14
2018-04-06 10:45



Alte Frage, aber eine zutreffende Antwort. Wenn Sie sicherstellen müssen, dass das Volume in einem lokalen Pfad enthalten ist, können Sie System.IO.Path.GetFullPath () wie folgt verwenden:

if (template == System.IO.Path.GetFullPath(template))
{
    ; //template is full path including volume or full UNC path
}
else
{
    if (useCurrentPathAndVolume)
        template = System.IO.Path.GetFullPath(template);
    else
        template = Assembly.GetExecutingAssembly().Location
}

10
2017-09-19 12:34



Aufbauend auf WehrAntwort: Dies wirft nicht auf ungültige Pfade, sondern kehrt auch zurück false für Pfade wie "C:", "C: dirname" und "\ path".

public static bool IsFullPath(string path)
{
    if (string.IsNullOrWhiteSpace(path) || path.IndexOfAny(Path.GetInvalidPathChars()) != -1 || !Path.IsPathRooted(path))
        return false;

    var pathRoot = Path.GetPathRoot(path);
    if (pathRoot.Length <= 2 && pathRoot != "/") // Accepts X:\ and \\UNC\PATH, rejects empty string, \ and X:, but accepts / to support Linux
        return false;

    return !(pathRoot == path && pathRoot.StartsWith("\\\\") && pathRoot.IndexOf('\\', 2) == -1); // A UNC server name without a share name (e.g "\\NAME") is invalid
}

Beachten Sie, dass dies zu unterschiedlichen Ergebnissen unter Windows und Linux führt, z. "/ Pfad" ist absolut unter Linux, aber nicht unter Windows.

Gerätetest:

[Test]
public void IsFullPath()
{
    bool isWindows = Environment.OSVersion.Platform.ToString().StartsWith("Win"); // .NET Framework
    // bool isWindows = System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Windows); // .NET Core

    // These are full paths on Windows, but not on Linux
    TryIsFullPath(@"C:\dir\file.ext", isWindows);
    TryIsFullPath(@"C:\dir\", isWindows);
    TryIsFullPath(@"C:\dir", isWindows);
    TryIsFullPath(@"C:\", isWindows);
    TryIsFullPath(@"\\unc\share\dir\file.ext", isWindows);
    TryIsFullPath(@"\\unc\share", isWindows);

    // These are full paths on Linux, but not on Windows
    TryIsFullPath(@"/some/file", !isWindows);
    TryIsFullPath(@"/dir", !isWindows);
    TryIsFullPath(@"/", !isWindows);

    // Not full paths on either Windows or Linux
    TryIsFullPath(@"file.ext", false);
    TryIsFullPath(@"dir\file.ext", false);
    TryIsFullPath(@"\dir\file.ext", false);
    TryIsFullPath(@"C:", false);
    TryIsFullPath(@"C:dir\file.ext", false);
    TryIsFullPath(@"\dir", false); // An "absolute", but not "full" path

    // Invalid on both Windows and Linux
    TryIsFullPath(null, false, false);
    TryIsFullPath("", false, false);
    TryIsFullPath("   ", false, false);
    TryIsFullPath(@"C:\inval|d", false, false);
    TryIsFullPath(@"\\is_this_a_dir_or_a_hostname", false, false);
}

private static void TryIsFullPath(string path, bool expectedIsFull, bool expectedIsValid = true)
{
    Assert.AreEqual(expectedIsFull, PathUtils.IsFullPath(path), "IsFullPath('" + path + "')");

    if (expectedIsFull)
    {
        Assert.AreEqual(path, Path.GetFullPath(path));
    }
    else if (expectedIsValid)
    {
        Assert.AreNotEqual(path, Path.GetFullPath(path));
    }
    else
    {
        Assert.That(() => Path.GetFullPath(path), Throws.Exception);
    }
}

4
2017-11-30 09:24



Ich bin mir nicht sicher, was du damit meinst vollständigen Pfad (Obwohl Sie von dem Beispiel ausgehen, dass Sie von der Wurzel an nicht-relativ sind), können Sie die Pfad Klasse, die Ihnen bei der Arbeit mit physischen Dateisystempfaden hilft, die Sie für die meisten Eventualitäten abdecken sollten.


0
2018-04-06 10:43



Dies ist die Lösung, die ich verwende

public static bool IsFullPath(string path)
{
    try
    {
        return Path.GetFullPath(path) == path;
    }
    catch
    {
        return false;
    }
}

Es funktioniert folgendermaßen:

IsFullPath(@"c:\foo"); // true
IsFullPath(@"C:\foo"); // true
IsFullPath(@"c:\foo\"); // true
IsFullPath(@"c:/foo"); // false
IsFullPath(@"\foo"); // false
IsFullPath(@"foo"); // false
IsFullPath(@"c:1\foo\"); // false

0
2018-04-11 12:49



Um zu überprüfen, ob ein Pfad ist vollqualifiziert (MSDN):

public static bool IsPathFullyQualified(string path)
{
    var root = Path.GetPathRoot(path);
    return root.StartsWith(@"\\") || root.EndsWith(@"\");
}

Es ist ein bisschen einfacher als das, was bereits vorgeschlagen wurde, und es gibt immer noch false für Laufwerk relative Pfade wie C:foo. Seine Logik basiert direkt auf der MSDN-Definition von "voll qualifiziert", und ich habe keine Beispiele gefunden, bei denen es sich falsch verhält.


Interessanterweise scheint .NET Core 2.1 jedoch eine neue Methode zu haben Path.IsPathFullyQualified welches eine interne Methode benutzt PathInternal.IsPartiallyQualified (link location genau ab 2018-04-17).

Für die Nachwelt und bessere Selbsteindämmung dieses Beitrags, hier ist die Implementierung des letzteren als Referenz:

internal static bool IsPartiallyQualified(ReadOnlySpan<char> path)
{
    if (path.Length < 2)
    {
        // It isn't fixed, it must be relative.  There is no way to specify a fixed
        // path with one character (or less).
        return true;
    }

    if (IsDirectorySeparator(path[0]))
    {
        // There is no valid way to specify a relative path with two initial slashes or
        // \? as ? isn't valid for drive relative paths and \??\ is equivalent to \\?\
        return !(path[1] == '?' || IsDirectorySeparator(path[1]));
    }

    // The only way to specify a fixed path that doesn't begin with two slashes
    // is the drive, colon, slash format- i.e. C:\
    return !((path.Length >= 3)
        && (path[1] == VolumeSeparatorChar)
        && IsDirectorySeparator(path[2])
        // To match old behavior we'll check the drive character for validity as the path is technically
        // not qualified if you don't have a valid drive. "=:\" is the "=" file's default data stream.
        && IsValidDriveChar(path[0]));
}

0
2018-04-17 16:47