22

我有两个 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

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

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

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

丑陋的解决方案是/在 Uri 不存在时添加

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

5 回答 5

25

这应该为您解决问题:

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

构造函数遵循标准的相对 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
于 2012-04-28T16:41:05.427 回答
17

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

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

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

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

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

不是

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

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

于 2009-05-19T22:45:08.367 回答
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;
        }
    }

安杰洛,亚历山德罗

于 2010-05-14T10:27:34.830 回答
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);
于 2009-05-19T22:42:13.847 回答
0

为什么不直接从 Uri 继承并使用它,即。在构造函数中你需要做什么来修复它?假设这是在组装内部或触手可及的情况下,重构很便宜。

于 2009-05-19T22:56:24.333 回答