2009-02-04 7 views
15

Dato un URI/URL assoluto, voglio ottenere un URI/URL che non contenga la parte foglia. Ad esempio: dato http://foo.com/bar/baz.html, dovrei ottenere http://foo.com/bar/.Ottenere il nome genitore di un URI/URL dal nome assoluto C#

Il codice che ho potuto ricavare sembra un po 'lungo, quindi mi chiedo se c'è un modo migliore.

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

Si potrebbe utilizzare la funzione di qualcosa di simile a questo:

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

Grazie, Rohit

risposta

25

Questo è il più breve che posso venire con:

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

Se vuoi usare il metodo Last(), dovrai includere System.Linq.

+1

Sì, ma questo non causerà problemi se l'URL ha ripetute stringhe: http://foo.com/bar/baz/bar – Rohit

+0

Buon punto! Ho appena aggiornato la mia risposta. Grazie! – Martin

+1

Attenzione: questo ignora la stringa di query. – Brian

1

rapido e sporco

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

solo una FYI ... ci sono casi in cui questo può rompersi ... se c'è un URI non codificato nella stringa di query che è straordinariamente legale –

+0

Grazie Steve. Per me, dimostra il fatto che non si dovrebbe mai usare la stringa nuda o la manipolazione delle espressioni regolari per formati complessi come l'URI o il percorso del file :) – dbkk

7

ci deve essere un modo più semplice per fare questo con il costruito nel metodi uri ma qui è la mia torsione su @unknown (yahoo) 's suggerimento.
In questa versione non è necessario System.Linq e gestisce anche gli URI con le stringhe di query:

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

via più breve che ho trovato:

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

Hai provato questo? Sembra abbastanza semplice.

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

Leggermente errato. Come lo hai ora, è corretto solo se uri è una directory. Se uri è un file (come indicato nel post originale) allora il modo corretto è 'Uri parent = new Uri (uri,". ");' –

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

risposta di PapyRef non è corretta, UriPartial.Path include il nome del file.

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

sembra essere l'implementazione più pulita/più semplice della funzione richiesta.

+0

Ho scoperto che funziona solo se la risorsa è un file. Se è un URL finisce con '/' non rimuoverà l'ultimo segmento. –

0

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

Questo mi riporta, "Comune"

1

Ho letto molte risposte qui, ma non ha trovato uno che mi è piaciuto perché si rompono in alcuni casi.

Quindi, io sto usando questo:

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

Nota: Rimuove la query e il frammento intenzionalmente.

Problemi correlati