Verfügt das .NET Framework über Methoden zum Konvertieren eines Pfads (z. B. "C:\whatever.txt"
) in einen Datei-URI (z. B. "file:///C:/whatever.txt"
)?
Die System.Uri- Klasse hat das Gegenteil (von einem Datei-URI zu einem absoluten Pfad), aber nichts, was ich für die Konvertierung in einen Datei-URI finden kann.
Dies ist auch keine ASP.NET-Anwendung.
var path = new Uri("file:///C:/whatever.txt").LocalPath;
verwandelt einen Uri wieder in einen lokalen Dateipfad für alle, die dies benötigen.new Uri(@"C:\%51.txt").AbsoluteUri
gibt Ihnen"file:///C:/Q.txt"
statt"file:///C:/%2551.txt"
Was niemand zu bemerken scheint, ist, dass keiner der
System.Uri
Konstruktoren bestimmte Pfade mit Prozentzeichen korrekt behandelt.Dies gibt Ihnen
"file:///C:/Q.txt"
statt"file:///C:/%2551.txt"
.Keiner der Werte des veralteten dontEscape-Arguments macht einen Unterschied, und die Angabe von UriKind führt ebenfalls zum gleichen Ergebnis. Der Versuch mit dem UriBuilder hilft auch nicht:
Dies kehrt
"file:///C:/Q.txt"
ebenfalls zurück.Soweit ich das beurteilen kann, fehlt dem Framework tatsächlich eine Möglichkeit, dies richtig zu machen.
Wir können es versuchen, indem wir die umgekehrten Schrägstriche durch vordere Schrägstriche ersetzen und den Pfad zu
Uri.EscapeUriString
- dh vorgebenDies scheint auf den ersten zu arbeiten, aber wenn man es den Weg geben
C:\a b.txt
dann Sie am Ende mitfile:///C:/a%2520b.txt
stattfile:///C:/a%20b.txt
- irgendwie entscheidet es , dass einige Sequenzen decodiert werden sollten , andere aber nicht. Jetzt könnten wir uns nur noch ein Präfix"file:///"
machen, dies\\remote\share\foo.txt
berücksichtigt jedoch nicht die UNC-Pfade wie - was unter Windows allgemein akzeptiert zu sein scheint, ist, sie in Pseudo-URLs des Formulars umzuwandelnfile://remote/share/foo.txt
, daher sollten wir dies ebenfalls berücksichtigen.EscapeUriString
hat auch das problem, dass es dem'#'
charakter nicht entgeht . An diesem Punkt scheinen wir keine andere Wahl zu haben, als unsere eigene Methode von Grund auf neu zu entwickeln. Das schlage ich also vor:Dies lässt absichtlich + und: unverschlüsselt, da dies unter Windows normalerweise so zu sein scheint. Es codiert auch nur latin1, da Internet Explorer Unicode-Zeichen in Datei-URLs nicht verstehen kann, wenn sie codiert sind.
quelle
VB.NET:
Verschiedene Ausgänge:
Einzeiler:
quelle
AbsoluteUri
ist richtig, weil es auch Leerzeichen in% 20 codiert.Die oben genannten Lösungen funktionieren unter Linux nicht.
Der Versuch, mit .NET Core auszuführen,
new Uri("/home/foo/README.md")
führt zu einer Ausnahme:Sie müssen der CLR einige Hinweise geben, welche Art von URL Sie haben.
Das funktioniert:
... und die von zurückgegebene Zeichenfolge
fileUri.ToString()
ist"file:///home/foo/README.md"
Dies funktioniert auch unter Windows.
new Uri(new Uri("file://"), @"C:\Users\foo\README.md").ToString()
... emittiert
"file:///C:/Users/foo/README.md"
quelle
new Uri("/path/to/file", UriKind.Absolute);
Zumindest in .NET 4.5+ können Sie außerdem Folgendes tun:
quelle
UriFormatException
einen Tag?new Uri(@"C:\%51.txt",UriKind.Absolute).AbsoluteUri
kehrt"file:///C:/Q.txt"
statt"file:///C:/%2551.txt"
UrlCreateFromPath zur Rettung! Nun, nicht ganz, da es keine erweiterten und UNC-Pfadformate unterstützt, aber das ist nicht so schwer zu überwinden:
Wenn der Pfad mit einem speziellen Präfix beginnt, wird er entfernt. Obwohl die Dokumentation dies nicht erwähnt, gibt die Funktion die Länge der URL aus, auch wenn der Puffer kleiner ist. Daher erhalte ich zuerst die Länge und ordne dann den Puffer zu.
Eine sehr interessante Beobachtung, die ich hatte, ist, dass während "\\ Gerät \ Pfad" korrekt in "Datei: // Gerät / Pfad" transformiert wird, speziell "\\ localhost \ Pfad" nur in "Datei: /// Pfad" transformiert wird. .
Die WinApi-Funktion hat es geschafft, Sonderzeichen zu codieren, lässt jedoch Unicode-spezifische Zeichen im Gegensatz zum Uri- Construtor nicht codiert. In diesem Fall enthält AbsoluteUri die ordnungsgemäß codierte URL, während OriginalString zum Beibehalten der Unicode-Zeichen verwendet werden kann.
quelle
Die Problemumgehung ist einfach. Verwenden Sie einfach die Uri (). ToString () -Methode und codieren Sie anschließend Leerzeichen in Prozent, falls vorhanden.
Gibt die Datei ordnungsgemäß zurück : /// C: / my% 20example ㄓ .txt
quelle