我有两个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 + "/");
答案 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并使用它,即。在构造函数中做什么来修复它需要做什么?重构很便宜,假设这是装配内部或触手可及..