Получение родительского имени URI/URL из абсолютного имени С#
Учитывая абсолютный 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);
}
Спасибо,
Рохит
Ответы
Ответ 1
Это самое короткое, что я могу придумать:
static string GetParentUriString(Uri uri)
{
return uri.AbsoluteUri.Remove(uri.AbsoluteUri.Length - uri.Segments.Last().Length);
}
Если вы хотите использовать метод Last(), вам нужно будет включить System.Linq.
Ответ 2
Вы попробовали это? Кажется, достаточно просто.
Uri parent = new Uri(uri, "..");
Ответ 3
Должен быть более простой способ сделать это с помощью встроенных методов 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);
}
Ответ 4
Быстрый и грязный
int pos = uriString.LastIndexOf('/');
if (pos > 0) { uriString = uriString.Substring(0, pos); }
Ответ 5
Самый короткий путь я нашел:
static Uri GetParent(Uri uri) {
return new Uri(uri, Path.GetDirectoryName(uri.LocalPath) + "/");
}
Ответ 6
Я прочитал много ответов здесь, но не нашел того, что мне понравилось, потому что в некоторых случаях они ломаются.
Итак, я использую это:
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;
}
Примечание: Умышленно удаляет запрос и фрагмент.
Ответ 7
new Uri(uri.AbsoluteUri + "/../")
Ответ 8
Ответ PapyRef неверен, UriPartial.Path
содержит имя файла.
new Uri(uri, ".").ToString()
кажется, это самая чистая/простая реализация запрошенной функции.
Ответ 9
Получить сегмент 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"