我有一個asp.net url路徑正在生成一個web窗體,並出現了像「/foo/bar/../bar/path.aspx」,並且即將到來在這樣生成的html中也是如此。它應該縮寫爲「/foo/bar/path.aspx」。Asp.net路徑壓縮
Path.Combine沒有解決它。有沒有一個功能來清理這條路?
我有一個asp.net url路徑正在生成一個web窗體,並出現了像「/foo/bar/../bar/path.aspx」,並且即將到來在這樣生成的html中也是如此。它應該縮寫爲「/foo/bar/path.aspx」。Asp.net路徑壓縮
Path.Combine沒有解決它。有沒有一個功能來清理這條路?
您可以創建一個輔助類裏面包裹的UriBuilder類System.Net
public static class UriHelper
{
public static string NormalizeRelativePath(string path)
{
UriBuilder _builder = new UriBuilder("http://localhost");
builder.Path = path;
return builder.Uri.AbsolutePath;
}
}
然後可以使用這樣的:
string url = "foo/bar/../bar/path.aspx";
Console.WriteLine(UriHelper.NormalizeRelativePath(url));
這是一個有點哈克,但它的工作你給的具體例子。
編輯:更新以反映安德魯的評論。
諷刺的回答比我好多了,但如果你用文件系統路徑的工作,我的醜陋的黑客下面可能變成是有用的。 (翻譯:我輸入它,所以我會被定罪,如果我不發佈它:)
Path.Combine只是將兩個字符串打成一片,注意引導或結尾的斜線。據我所知,做標準化的唯一Path方法是Path.GetFullPath。以下將給你「清理」版本。
myPath = System.IO.Path.GetFullPath(myPath);
當然,有小問題所得到的路徑將被植根和正斜槓將被轉換到後斜槓(如「C:\ FOO \條\ path.aspx」)。但是,如果您知道原始路徑的父級根目錄,則刪除根目錄應該不是什麼大問題。
不管你做什麼,都不要使用靜態的UriBuilder。這會引入各種潛在的競爭條件,直到您處於重負載狀態時才能檢測到。
如果兩個不同的線程同時調用UriHelper.NormalizeRelativePath,則返回值可以任意返回給另一個調用者。
如果您想使用UriBuilder來做到這一點,只需在需要時創建一個新的(創建並不昂貴)。
@Andrew關於靜態UrlBuilder實例的很好的一點。我會祈求寬恕神的多線程。 – 2008-09-10 15:13:42