Da nichts anderes, was ich gefunden habe, hilft, dies auf wirklich normalisierte Weise zu lösen, ist hier eine andere Antwort.
Beachten Sie, dass einige Antworten auf ähnliche Fragen versuchen, das zu verwenden Uri
Typ zu verwenden, dies jedoch mit abschließenden Schrägstrichen keinen abschließenden Schrägstrichen zu kämpfen hat.
Meine andere Antwort auf dieser Seite funktioniert für Vorgänge, bei denen das Dateisystem funktioniert, aber wenn wir den aufgelösten Pfad jetzt haben möchten (z. B. aus Vergleichsgründen), ohne das Dateisystem zu durchlaufen, C:/Temp/..
undC:/
würde anders betrachtet werden. Ohne das Dateisystem zu durchlaufen, bietet uns die Navigation auf diese Weise keinen normalisierten, ordnungsgemäß vergleichbaren Pfad.
Was können wir tun?
Wir werden auf der folgenden Entdeckung aufbauen:
Path.GetDirectoryName(path + "/") ?? ""
wird zuverlässig uns einen Verzeichnispfad geben ohne einen Schrägstrich .
- Durch Hinzufügen eines Schrägstrichs (als
string
, nicht als char
) wird ein null
Pfad genauso behandelt, wie er behandelt wird""
.
GetDirectoryName
wird die letzte Pfadkomponente dank des hinzugefügten Schrägstrichs nicht verwerfen.
GetDirectoryName
normalisiert Schrägstriche und Navigationspunkte.
- Dies schließt das Entfernen von nachgestellten Schrägstrichen ein.
- Dies schließt das Reduzieren
..
durch Navigieren nach oben ein.
GetDirectoryName
wird null
für einen leeren Weg zurückkehren, zu dem wir verschmelzen ""
.
Wie nutzen wir das?
Zuerst Normalisieren der Eingabepfad :
dirPath = Path.GetDirectoryName(dirPath + "/") ?? "";
Dann können wir das übergeordnete Verzeichnis abrufen und diesen Vorgang beliebig oft wiederholen, um weiter nach oben zu navigieren:
path = Path.GetDirectoryName(path);
Beachten Sie, dass wir das Dateisystem noch nie berührt haben. Kein Teil des Pfades muss existieren, wie es wäre, wenn wir es benutzt hätten DirectoryInfo
.