2012-06-11 118 views
8

Como sabemos que una directiva virtual se puede vincular a una carpeta con un nombre diferente, ¿cómo puedo obtener la ruta física de un directorio virtual?Cómo obtener la ruta física del directorio virtual

He estado intentando con HttpContext.Current.server.MapPath, pero me devuelve la ruta física más la ruta que envío en el parámetro incluso si el directorio no existe o si existe con un nombre diferente.

Ejemplo:

C: \ blabla \ Sites \ Application1 \ Imaageesss - En el disco

Application1 \ Images (En ISS, mi directorio virtual)

Pero si hago un MapPath en "/ Imágenes" nunca me dará C: \ blabla \ Sites \ Application1 \ Imaageesss but C: \ inetpub \ wwwroot \ Imágenes a las que no está vinculado el directorio real.

+0

Todas las respuestas a continuación no resuelven el problema. Supongo que MapPath no es lo suficientemente inteligente como para comprobar si es un directorio virtual de IIS o no. Simplemente agrega la ruta raíz de la aplicación a la ruta que proporcione. Lamentablemente, no pude encontrar una solución para esto incluso después de buscar intensamente en la web. – needfulthing

+0

Encontrado un camino, ver respuesta a continuación. – needfulthing

+0

Tuve un problema similar en dos circunstancias diferentes. Tuve que llamar a 'Server.MapPath ("/Application1/Images/image.jpg ")' en lugar de a 'Server.MapPath ("/Images/image.jpg ")' en una situación, y la otra resultó ser I mis referencias a mi nombre de directorio virtual dentro de mi aplicación. Tuve el mismo resultado que el OP experimentó hasta que hice cada una de estas cosas. Solo pensé que agregaría ... – ionalchemist

Respuesta

9
Server.MapPath("~/Images") 

es la forma correcta de hacerlo como "~" hace referencia a la raíz de su aplicación.

2

¿Qué pasa si prueba este pequeño fragmento?

string physicalPath = HttpContext.Current.Request.MapPath(appPath); 
0

Esto podría responder a su pregunta:

http://msdn.microsoft.com/en-us/library/system.web.httprequest.physicalpath.aspx

Sin embargo, no puede actualmente proporcionar un ejemplo, porque tengo mucho trabajo que hacer. Cuando encuentre algo de tiempo, enviaré información detallada.

+1

Gracias, pero acabo de encontrar mi error después de la prueba durante mucho tiempo. El directorio virtual que estoy buscando está en una aplicación, así que necesito hacer HttpContext.Current.server.MapPath ("/ Application/Images") y no juste "/ Images" – Vinhent

5

Esto es lo que funcionó para mí:

string physicalPath =  
System.Web.Hosting.HostingEnvironment.MapPath(HttpContext.Current.Request.ApplicationPath); 
1

Después de un poco más de investigación que fue capaz de crear un método para obtener la ruta física de un directorio virtual de IIS:

public static string VirtualToPhysicalPath(string vPath) { 
    // Remove query string: 
    vPath = Regex.Replace(vPath, @"\?.+", "").ToLower(); 

    // Check if file is in standard folder: 
    var pPath = System.Web.Hosting.HostingEnvironment.MapPath("~" + vPath); 
    if (System.IO.File.Exists(pPath)) return pPath; 

    // Else check for IIS virtual directory: 
    var siteName = System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName(); 
    var sm = new Microsoft.Web.Administration.ServerManager(); 
    var vDirs = sm.Sites[siteName].Applications[0].VirtualDirectories; 
    foreach (var vd in vDirs) { 
     if (vd.Path != "/" && vPath.Contains(vd.Path.ToLower())) pPath = vPath.Replace(vd.Path.ToLower(), vd.PhysicalPath).Replace("/", "\\"); 
    } 
    return pPath; 
} 

Advertencia: esta solución asume que es suficiente con una aplicación de raíz (Aplicaciones [0])

Cuestiones relacionadas