Frage
Ich habe einen asp.net-URL-Pfad, der in einem Webformular generiert wird und in etwa wie „/foo/bar/../bar/path.aspx“ aussieht und im generierten HTML auch so ausgegeben wird .Es sollte auf „/foo/bar/path.aspx“ gekürzt werden.
Path.Combine hat das Problem nicht behoben.Gibt es eine Funktion zum Bereinigen dieses Pfades?
Lösung
Sie können eine Hilfsklasse erstellen, die die UriBuilder Klasse in System.Net gewickelt
public static class UriHelper
{
public static string NormalizeRelativePath(string path)
{
UriBuilder _builder = new UriBuilder("http://localhost");
builder.Path = path;
return builder.Uri.AbsolutePath;
}
}
, die dann wie folgt verwendet werden:
string url = "foo/bar/../bar/path.aspx";
Console.WriteLine(UriHelper.NormalizeRelativePath(url));
Es ist ein bisschen hacky, aber es wäre für das spezifische Beispiel arbeiten Sie gab.
EDIT:. Aktualisiert Andreas Kommentare spiegeln
Andere Tipps
Was immer Sie tun, verwenden Sie nicht einen statischen UriBuilder. Dies führt alle Arten von möglichen Rennbedingungen, die Sie möglicherweise nicht erkennen, bis Sie unter hohen Last sind.
Wenn zwei verschiedene Threads UriHelper.NormalizeRelativePath zugleich, der Rückgabewert für einen zum anderen Anrufer zurückgeleitet willkürlich. Werden könnten
genanntWenn Sie UriBuilder verwenden, um dies zu tun, erstellen Sie einfach eine neue, wenn Sie es brauchen (es ist nicht teuer zu erstellen).
Sarcastic Antwort ist so viel besser als meine, aber wenn Sie mit Dateisystem Pfade gearbeitet haben, mein hässliche Hack unten könnte sich als nützlich zu sein. (Übersetzung: Ich tippte es, so ich will verdammt sein, wenn ich es nicht schreiben:)
Path.Combine schlägt nur zwei Strings zusammen, die Aufmerksamkeit auf Vorder- oder Hinterschrägstriche zu bezahlen. Soweit ich weiß, ist der einzige Weg Methode, die Normalisierung tut, ist Path.GetFullPath. Im Folgenden werden Sie die „gereinigt“ -Version.
myPath = System.IO.Path.GetFullPath(myPath);
Natürlich gibt es das kleine Problem, dass der resultierende Pfad verwurzelt sein wird und die Schrägstriche umgewandelt werden Schrägstriche nach hinten (wie „C: \ foo \ bar \ path.aspx“). Aber wenn Sie die übergeordnete Wurzel des ursprünglichen Pfades kennen, sollte die Wurzel Strippen kein großes Problem sein.