2009-02-04 10 views
15

Biorąc pod uwagę bezwzględny adres URI/URL, chcę uzyskać identyfikator URI/URL, który nie zawiera części liści. Na przykład: podając http://foo.com/bar/baz.html, powinienem otrzymać http://foo.com/bar/.Uzyskiwanie nazwy nadrzędnej identyfikatora URI/adresu URL od nazwy absolutnej C#

Kod, który mogłem wymyślić wydaje się nieco długi, więc zastanawiam się, czy istnieje lepszy sposób.

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

Można by użyć funkcji coś takiego:

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

Dzięki Rohit

Odpowiedz

25

Jest to najkrótsza mogę wymyślić:

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

Jeśli chcesz użyć metody Last(), będziesz musiał uwzględnić System.Linq.

+1

Tak, ale nie spowoduje to problemu, jeśli URL będzie zawierał ciągi: http://foo.com/bar/baz/bar – Rohit

+0

Dobra rada! Właśnie zaktualizowałem swoją odpowiedź. Dzięki! – Martin

+1

Ostrzeżenie: To ignoruje ciąg zapytania. – Brian

1

Szybki i brudny

int pos = uriString.LastIndexOf('/'); 
if (pos > 0) { uriString = uriString.Substring(0, pos); } 
+0

tylko FYI ... są przypadki, w których to może się zepsuć ... jeśli w ciągu zapytania jest niekodowany URI, który jest niesamowicie legalny –

+0

Dziękuję Steve. Dla mnie jest to dowodem na to, że nigdy nie należy używać nagiego ciągu lub wyrażeń regularnych dla złożonych formatów, takich jak URI lub ścieżka pliku :) – dbkk

7

Musi być łatwiejszy sposób to zrobić za pomocą wbudowanego w metodach uri ale tutaj jest moja wariacja na @unknown (Yahoo) 's sugestia.
W tej wersji nie trzeba System.Linq a także uchwyty URI z ciągów zapytań:

private static string GetParentUriString(Uri uri) 
{ 
    return uri.AbsoluteUri.Remove(uri.AbsoluteUri.Length - uri.Segments[uri.Segments.Length -1].Length - uri.Query.Length); 
} 
1

najkrótsza droga znalazłem:

static Uri GetParent(Uri uri) { 
    return new Uri(uri, Path.GetDirectoryName(uri.LocalPath) + "/"); 
} 
25

Próbowałeś tego? Wydaje się dość proste.

Uri parent = new Uri(uri, ".."); 
+16

Nieco niepoprawny. Jak już masz, jest to poprawne tylko jeśli uri jest katalogiem. Jeśli uri jest plikiem (jak wskazano w oryginalnym wpisie), poprawną metodą jest 'Uri parent = new Uri (uri,". ");' –

0
new Uri(uri.AbsoluteUri + "/../") 
0

odpowiedź PapyRef jest nieprawidłowe, UriPartial.Path zawiera nazwę pliku.

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

wydaje się być najczystszą/najprostszą implementacją żądanej funkcji.

+0

Znalazłem, że działa tylko wtedy, gdy zasób jest plikiem. Jeśli adres URL kończy się na '/', to nie usunie ostatniego segmentu. –

0

Get segmenation 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("/")) 

ta zwraca mi: „Wspólna”

1

Czytałem wiele odpowiedzi tutaj, ale nie znaleźliśmy taki, który mi się podobało, bo przerwa w niektórych przypadkach.

Więc używam to:

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

Uwaga: Usuwa kwerendę i fragment umyślnie.

Powiązane problemy