Pregunta

Tengo una ruta de URL de asp.net que se genera en un formulario web y aparece algo así como "/foo/bar/../bar/path.aspx", y también aparece en el html generado de esta manera. .Debería abreviarse a "/foo/bar/path.aspx".

Path.Combine no lo solucionó.¿Existe una función para limpiar este camino?

¿Fue útil?

Solución

Podrías crear una clase auxiliar que incluya la clase UriBuilder en System.Net

public static class UriHelper
{       
    public static string NormalizeRelativePath(string path)
    {
        UriBuilder _builder = new UriBuilder("http://localhost");
        builder.Path = path;
        return builder.Uri.AbsolutePath;
    }
}

que luego podría usarse así:

string url = "foo/bar/../bar/path.aspx";
Console.WriteLine(UriHelper.NormalizeRelativePath(url));

Es un poco complicado pero funcionaría para el ejemplo específico que diste.

EDITAR:Actualizado para reflejar los comentarios de Andrew.

Otros consejos

Hagas lo que hagas, no utilices un UriBuilder estático.Esto introduce todo tipo de posibles condiciones de carrera que quizás no detectes hasta que estés bajo una carga pesada.

Si dos subprocesos diferentes llamaron a UriHelper.NormalizeRelativePath al mismo tiempo, el valor de retorno de uno podría pasarse al otro autor de la llamada de forma arbitraria.

Si desea utilizar UriBuilder para hacer esto, simplemente cree uno nuevo cuando lo necesite (no es costoso crearlo).

La respuesta de Sarcastic es mucho mejor que la mía, pero si estuvieras trabajando con rutas de sistemas de archivos, mi truco feo a continuación también podría resultar útil.(Traducción:Lo escribí, así que que me condenen si no lo publico :)

Path.Combine simplemente junta dos cuerdas, prestando atención a las barras diagonales iniciales o finales.Hasta donde yo sé, el único método Path que realiza la normalización es Path.GetFullPath.Lo siguiente le dará la versión "limpiada".

myPath = System.IO.Path.GetFullPath(myPath);

Por supuesto, existe el pequeño problema de que la ruta resultante tendrá raíz y las barras diagonales se convertirán en barras invertidas (como "C:\foo\bar\path.aspx").Pero si conoce la raíz principal de la ruta original, eliminar la raíz no debería ser un gran problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top