我有一个 asp.net url 路径,它是在 web 表单中生成的,并且会出现类似“/foo/bar/../bar/path.aspx”的内容,并且也会像这样在生成的 html 中出现. 它应该缩短为“/foo/bar/path.aspx”。
Path.Combine 没有修复它。有清理这条路径的功能吗?
您可以创建一个助手类,它在 System.Net 中包装了 UriBuilder 类
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));
这有点hacky,但它适用于您给出的具体示例。
编辑:更新以反映安德鲁的评论。
无论您做什么,都不要使用静态 UriBuilder。这引入了各种潜在的竞争条件,直到您处于重负载下才能检测到。
如果两个不同的线程同时调用 UriHelper.NormalizeRelativePath,则一个线程的返回值可以任意传回另一个调用者。
如果您想使用 UriBuilder 来执行此操作,只需在需要时创建一个新的(创建成本不高)。
Sarcastic 的回复比我的要好得多,但是如果您使用的是文件系统路径,那么我在下面的丑陋的 hack可能也很有用。(翻译:我打的,不贴我就完蛋了:)
Path.Combine 只是将两个字符串拼接在一起,注意前导或尾随斜杠。据我所知,唯一进行标准化的 Path 方法是 Path.GetFullPath。以下将为您提供“清理”版本。
myPath = System.IO.Path.GetFullPath(myPath);
当然,有一个小问题是生成的路径将被植根并且正斜杠将被转换为反斜杠(如“C:\foo\bar\path.aspx”)。但是如果您知道原始路径的父根,那么剥离根应该不是什么大问题。