如何组合URI

时间:2009-05-19 22:39:16

标签: .net uri

我有两个Uri对象传入一些代码,一个是目录,另一个是文件名(或相对路径)

var a = new Uri("file:///C:/Some/Dirs");
var b = new Uri("some.file");

当我尝试将它们组合起来时这样:

var c = new Uri(a,b);

我得到了

  

file:///C:/Some/some.file

我希望得到与Path.Combine相同的效果(因为那是我需要替换的旧代码):

  

file:///C:/Some/Dirs/some.file

我想不出一个干净的解决方案。

丑陋的解决方案是向Uri添加/,如果它不在那里

string s = a.OriginalString;
if(s[s.Length-1] != '/')
   a = new Uri(s + "/");

5 个答案:

答案 0 :(得分:21)

这应该适合你:

var baseUri = new Uri("http://www.briankeating.net");
var absoluteUri = new Uri(baseUri, "/api/GetDefinitions");

constructor遵循标准相对URI规则,因此/非常重要:

  • http://example.net + foo = http://example.net/foo
  • http://example.net/foo/bar + baz = http://example.net/foo/baz
  • http://example.net/foo/ + bar = http://example.net/foo/bar
  • http://example.net/foo + bar = http://example.net/bar
  • http://example.net/foo/bar/ + /baz = http://example.net/baz

答案 1 :(得分:16)

好吧,你将不得不告诉Uri 以某种方式最后一部分是目录而不是文件。对我来说,使用尾部斜线似乎是最明显的方式。

请记住,对于许多Uris来说,你得到的答案是完全正确的。例如,如果您的Web浏览器正在呈现

http://foo.com/bar/index.html

它看到“other.html”的相对链接然后转到

http://foo.com/bar/other.html

http://foo.com/bar/index.html/other.html

在“目录”上使用尾部斜线Uris是一种非常熟悉的方式,建议相对Uris应该只是追加而不是替换。

答案 2 :(得分:5)

您可以尝试这种扩展方法!一直工作! ; - )

 public static class StringExtension
    {
        public static string UriCombine(this string str, string param)
        {
            if (!str.EndsWith("/"))
            {
                str = str + "/";
            }
            var uri = new Uri(str);
            return new Uri(uri, param).AbsoluteUri;
        }
    }

Angelo,亚历山德罗

答案 3 :(得分:2)

添加第一个uri的斜杠结尾,URI将忽略多个斜杠(/)

var a = new Uri("file:///C:/Some/Dirs/");

修改

var a = new Uri("file:///C:/Some/Dirs");
var b = new Uri("some.file",  UriKind.Relative);
var c = new Uri(Path.Combine(a.ToString(), b.ToString()));
MessageBox.Show(c.AbsoluteUri);

答案 4 :(得分:0)

为什么不继承Uri并使用它,即。在构造函数中做什么来修复它需要做什么?重构很便宜,假设这是装配内部或触手可及..