Подтвердить что ты не робот

Как объединить 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 + "/");
4b9b3361

Ответ 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

Почему бы просто не наследовать Ури и не использовать это, т.е. сделать в конструкторе то, что вам нужно сделать, чтобы исправить это? Рефакторинг является дешевым, если предположить, что он является внутренним для сборки или в пределах досягаемости.