2008-11-10 9 views
6

Estaba buscando algo como Server.MapPath en el reino de ASP.NET para convertir el resultado de Assembly.GetExecutingAssembly(). CodeBase en una ruta de archivo con letra de unidad.¿Hay un método .NET Framework para convertir archivos URI a rutas con letras de unidad?

El siguiente código funciona para los casos de prueba que he probado:

 
private static string ConvertUriToPath(string fileName) 
{ 
    fileName = fileName.Replace("file:///", ""); 
    fileName = fileName.Replace("/", "\\"); 
    return fileName; 
} 

Parece que debe haber algo en el .NET Framework que sería mucho mejor - simplemente no han sido capaces para encontrarlo.

+0

de Scott es lo que quiere, pero yo estoy fuera de los votos. – MusiGenesis

Respuesta

18

Intenta mirar la propiedad Uri.LocalPath.

private static string ConvertUriToPath(string fileName) 
{ 
    Uri uri = new Uri(fileName); 
    return uri.LocalPath; 

    // Some people have indicated that uri.LocalPath doesn't 
    // always return the corret path. If that's the case, use 
    // the following line: 
    // return uri.GetComponents(UriComponents.Path, UriFormat.SafeUnescaped); 
} 
+0

No siempre funciona. Ver: http://stackoverflow.com/a/28319367/321013 –

0

¿Puede simplemente usar Assembly.Location?

+0

No puedo usar Assembly.Location porque no es estático y el método desde el que debo realizar la llamada es estático. –

+1

Assembly.Location puede que no sea lo que estás buscando, pero no es porque sea un método no estático. Recuerde que puede instanciar un nuevo objeto dentro de un miembro estático. – akmad

+0

Assembly.Current.Location o Assembly.GetExecutingAssembly(). Ubicación –

3

busqué una respuesta mucho, y la respuesta más popular está utilizando Uri.LocalPath. Pero System.Uri no puede proporcionar LocalPath correcta si la ruta de acceso contiene "#". Los detalles son here.

Mi solución es: Respuesta

private static string ConvertUriToPath(string fileName) 
{ 
    Uri uri = new Uri(fileName); 
    return uri.LocalPath + Uri.UnescapeDataString(uri.Fragment).Replace('/', '\\'); 
} 
Cuestiones relacionadas