2009-02-04 17 views
15

Dado un URI/URL absoluto, quiero obtener un URI/URL que no contenga la parte de la hoja. Por ejemplo: dado http://foo.com/bar/baz.html, debería obtener http://foo.com/bar/.Obteniendo el nombre principal de un URI/URL del nombre absoluto C#

El código que podría aparecer parece un poco largo, entonces me pregunto si hay una mejor manera.

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

Se podría utilizar la función de algo como esto:

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

Gracias, Rohit

Respuesta

25

Esta es la más corta que se puede topar con:

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

Si desea utilizar el método Last(), tendrá que incluir System.Linq.

+1

Sí, pero esto no causará problemas si la URL tiene cadenas repetitivas: http://foo.com/bar/baz/bar – Rohit

+0

¡Buen punto! Acabo de actualizar mi respuesta. ¡Gracias! – Martin

+1

Advertencia: Esto ignora la cadena de consulta. – Brian

1

rápida y sucia

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

solo un FYI ... hay casos en que esto puede romperse ... si hay un URI no codificado en la cadena de consulta que es sorprendentemente legal –

+0

Gracias Steve. Para mí, prueba el hecho de que nunca se debe usar una cadena desnuda o manipulación de expresiones regulares para formatos complejos como URI o ruta de archivo :) – dbkk

7

Tiene que haber una manera más fácil de hacer esto con el construido en métodos uri pero aquí es mi giro en @unknown (yahoo) 's sugerencia.
En esta versión no es necesario System.Linq y también se encarga de URIs con cadenas de consulta:

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

manera más corta que encontré:

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

¿Usted intentó esto? Parece lo suficientemente simple.

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

Ligeramente incorrecto. Como lo tienes ahora, es correcto solo si uri es un directorio. Si uri es un archivo (como se indica en la publicación original), la forma correcta es 'Uri parent = new Uri (uri,". ");' –

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

respuesta de PapyRef es incorrecta, UriPartial.Path incluye el nombre del archivo.

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

parece ser la implementación más limpia/simple de la función solicitada.

+0

Encontré que solo funciona si el recurso es un archivo. Si es una URL que termina con '/', no eliminará el último segmento. –

0

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

Esto me devuelve, "común"

1

He leído muchas respuestas aquí, pero no encontró uno que me ha gustado porque se rompen en algunos casos.

Por lo tanto, estoy usando esto:

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: Se elimina la consulta y el fragmento de forma intencionada.

Cuestiones relacionadas