Как объединить 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
где я wold ожидаю получить тот же эффект, что и с Path.Combine
(так как это старый код, который мне нужно заменить):
file:///C:/Some/Dirs/some.file
Я не могу придумать для этого чистого решения.
Уродливое решение состоит в том, чтобы добавить a /
в Uri, если он не существует
string s = a.OriginalString;
if(s[s.Length-1] != '/')
a = new Uri(s + "/");
Ответы
Ответ 1
Хорошо, вам придется как-то сказать Uri, что последняя часть - это каталог, а не файл. Использование конечной косой черты, по-видимому, является наиболее очевидным для меня способом.
Имейте в виду, что для многих Уриса ответ, который у вас есть, совершенно прав. Например, если ваш веб-браузер выполняет рендеринг
http://foo.com/bar/index.html
и он видит относительно ссылку "other.html", затем переходит к
http://foo.com/bar/other.html
не
http://foo.com/bar/index.html/other.html
Использование конечной косой черты в "каталоге". Урис - довольно знакомый способ предложить, чтобы относительный Uris просто добавлял вместо замены.
Ответ 2
Это должно сделать трюк для вас:
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
Ответ 3
Вы можете попробовать этот метод расширения! Работает всегда!; -)
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;
}
}
Анджело, Алессандро
Ответ 4
добавить косую черту вашего первого uri, URI будет игнорировать больше одной косой черты (/)
var a = new Uri("file:///C:/Some/Dirs/");
EDIT:
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);
Ответ 5
Почему бы просто не наследовать Ури и не использовать это, т.е. сделать в конструкторе то, что вам нужно сделать, чтобы исправить это? Рефакторинг является дешевым, если предположить, что он является внутренним для сборки или в пределах досягаемости.