Получение родительского имени URI / URL из абсолютного имени C # - PullRequest
18 голосов
/ 04 февраля 2009

Учитывая абсолютный URI / URL, я хочу получить URI / URL, который не содержит листовую часть. Например: учитывая http://foo.com/bar/baz.html, я должен получить http://foo.com/bar/.

Код, который я мог бы придумать, кажется немного длинным, поэтому мне интересно, есть ли лучший способ.

static string GetParentUriString(Uri uri)
    {            
        StringBuilder parentName = new StringBuilder();

        // Append the scheme: http, ftp etc.
        parentName.Append(uri.Scheme);            

        // Appned the '://' after the http, ftp etc.
        parentName.Append("://");

        // Append the host name www.foo.com
        parentName.Append(uri.Host);

        // Append each segment except the last one. The last one is the
        // leaf and we will ignore it.
        for (int i = 0; i < uri.Segments.Length - 1; i++)
        {
            parentName.Append(uri.Segments[i]);
        }
        return parentName.ToString();
    }

Можно использовать функцию примерно так:

  static void Main(string[] args)
    {            
        Uri uri = new Uri("http://foo.com/bar/baz.html");
        // Should return http://foo.com/bar/
        string parentName = GetParentUriString(uri);                        
    }

Спасибо, Рохит

Ответы [ 10 ]

31 голосов
/ 17 февраля 2011

Вы пробовали это? Кажется достаточно простым.

Uri parent = new Uri(uri, "..");
29 голосов
/ 04 февраля 2009

Это самое короткое, что я могу придумать:

static string GetParentUriString(Uri uri)
{
    return uri.AbsoluteUri.Remove(uri.AbsoluteUri.Length - uri.Segments.Last().Length);
}

Если вы хотите использовать метод Last (), вам нужно будет включить System.Linq.

7 голосов
/ 21 мая 2009

Должен быть более простой способ сделать это с помощью встроенных методов uri, но вот мой поворот в предложении @unknown (yahoo).
В этой версии вам не нужен System.Linq, а также он обрабатывает URI со строками запроса:

private static string GetParentUriString(Uri uri)
{
    return uri.AbsoluteUri.Remove(uri.AbsoluteUri.Length - uri.Segments[uri.Segments.Length -1].Length - uri.Query.Length);
}
1 голос
/ 22 июля 2016

Я прочитал много ответов здесь, но не нашел тот, который мне понравился, потому что в некоторых случаях они ломаются.

Итак, я использую это:

public Uri GetParentUri(Uri uri) {
    var withoutQuery = new Uri(uri.GetComponents(UriComponents.Scheme |
                                                 UriComponents.UserInfo |
                                                 UriComponents.Host |
                                                 UriComponents.Port |
                                                 UriComponents.Path, UriFormat.UriEscaped));
    var trimmed = new Uri(withoutQuery.AbsoluteUri.TrimEnd('/'));
    var result = new Uri(trimmed, ".");
    return result;
}

Примечание: Преднамеренно удаляет запрос и фрагмент.

1 голос
/ 13 апреля 2010

Самый короткий путь, который я нашел:

static Uri GetParent(Uri uri) {
    return new Uri(uri, Path.GetDirectoryName(uri.LocalPath) + "/");
}
1 голос
/ 04 февраля 2009

Быстро и грязно

int pos = uriString.LastIndexOf('/');
if (pos > 0) { uriString = uriString.Substring(0, pos); } 
0 голосов
/ 11 июня 2018

Думал, что я буду вмешиваться; Несмотря на то, что прошло почти 10 лет, с появлением облака, получение родительского Uri является довольно распространенным (и IMO более ценным) сценарием, поэтому, комбинируя некоторые ответы здесь, вы просто используете (расширенную) семантику Uri:

public static Uri Parent(this Uri uri)
{
    return new Uri(uri.AbsoluteUri.Remove(uri.AbsoluteUri.Length - uri.Segments.Last().Length - uri.Query.Length).TrimEnd('/'));
}

var source = new Uri("https://foo.azure.com/bar/source/baz.html?q=1");

var parent = source.Parent();         // https://foo.azure.com/bar/source
var folder = parent.Segments.Last();  // source

Не могу сказать, что проверял каждый сценарий, поэтому советуем с осторожностью.

0 голосов
/ 07 мая 2015

Получить сегментацию URL

url="http://localhost:9572/School/Common/Admin/Default.aspx"

Dim name() As String = HttpContext.Current.Request.Url.Segments

now simply using for loop or by index, get parent directory name

code = name(2).Remove(name(2).IndexOf("/"))

Это возвращает меня, "Common"

0 голосов
/ 08 августа 2013

Неправильный ответ PapyRef, UriPartial.Path содержит имя файла.

new Uri(uri, ".").ToString()

представляется наиболее чистой / простой реализацией запрошенной функции.

0 голосов
/ 10 марта 2011
new Uri(uri.AbsoluteUri + "/../")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...