Как объединить URI - PullRequest
       29

Как объединить URI

19 голосов
/ 20 мая 2009

У меня есть два объекта 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 ]

21 голосов
/ 28 апреля 2012

Это должно помочь вам:

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

Этот конструктор следует стандартным относительным правилам URI, поэтому / важны:

16 голосов
/ 20 мая 2009

Ну, вам придется как-то сообщить 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 просто добавить вместо замены.

5 голосов
/ 14 мая 2010

Вы можете попробовать этот метод расширения! Работает всегда! ; -)

 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;
        }
    }

Анджело, Алессандро

2 голосов
/ 20 мая 2009

добавьте косую черту вашего первого 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);
0 голосов
/ 20 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...