从URL字符串中删除父路径的最快,最干净的方法是什么?

时间:2010-07-07 06:26:10

标签: c# string url

在C#中,有没有内置的方法来“纠正”其中包含父路径的网址?所以,我想接受这个:

/foo/bar/../baz.html

把它变成......

/foo/baz.html

(“bar”目录在路径中被“..”否定。)

我试图手动滚动它,但逻辑非常难看,非常快。考虑类似的事情:

/foo1/foo2/../foo3/foo4/foo5/../../bar.html

我向前走的路径是逐段浏览网址,然后开始编写新网址。如果第2段不是“..”,我只会在新网址中包含第1段。但是,在上面的例子中,我需要“向前看”并弄清楚我已经走了多少个父路径。

我尝试使用Path.GetFullPath,它在技术上让它工作,但是,伙计,它很难看。 公平警告:您可能希望避开这一点:

Path.GetFullPath(myUrl).Replace(Path.GetFullPath(@"\"), "").Replace(@"\", "/") + "/";

GetFullPath从“C:\”根返回文件系统路径,因此您实际上也必须替换它,而不是转换斜杠等。

我最终可能会爆出这个(我的丑陋代码在技术上可行),但是我觉得我不能成为第一个尝试这个的人。谷歌没有帮助。

(另一种语言的答案也会有所帮助 - 至少它会显示逻辑。)

3 个答案:

答案 0 :(得分:6)

这适用于所有网址(包括带有QueryString的网址):

var url = "/foo/bar/../bar.html";
var ubuilder = new UriBuilder();
ubuilder.Path = url;
var newURL = ubuilder.Uri.LocalPath;

答案 1 :(得分:2)

尝试VirtualPathUtility课程。它有一些方法可以在这里提供帮助,特别是ToAbsolute()方法,如果内存不会让我失败,应该能够获取应用程序相对路径并将其转换为应用程序绝对路径。 / p>

答案 2 :(得分:2)

如果你真的想要推出自己的版本,请尝试使用堆栈:

  1. 按路径分隔符'/'
  2. 拆分路径
  3. 遍历细分
    1. 将任何非'..'的段推送到堆栈
    2. 如果细分为'..',则弹出堆栈
  4. 使用路径分隔符'/'
  5. 加入细分受众群

    但正如其他人所说:让你的图书馆为你做这件事可能更好。