Obtener el directorio actual en la aplicación web .NET

105

Así que tengo un proyecto web y estoy tratando de obtener el directorio raíz del sitio web usando el método c # Directory.GetCurrentDirectory(). No quiero usar una ruta estática ya que las ubicaciones de los archivos cambiarán en el futuro. Este método se está ejecutando en mi archivo imageProcess.aspx.cs, pero donde pensé que volvería:

C:\Users\tcbl\documents\visual studio 2010\Projects\ModelMonitoring\ModelMonitoring\imageProcess.aspx.cs

En cambio estoy obteniendo:

C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\

¿Alguien puede explicar por qué está sucediendo esto y cuál podría ser una posible solución? Muchas gracias.

Julián Coltea
fuente
Publicación relacionada aquí que habla sobre las rutas de ejecución de aplicaciones .Net en general.
RBT
Otra publicación que habla sobre las rutas del mapa del servidor en aplicaciones web en .Net
RBT

Respuestas:

210

El directorio actual es una función a nivel del sistema; devuelve el directorio desde el que se inició el servidor. No tiene nada que ver con el sitio web.

Quieres HttpRuntime.AppDomainAppPath.

Si está en una solicitud HTTP, también puede llamar Server.MapPath("~/Whatever").

SLaks
fuente
2
Gracias. En realidad estaba buscando HttpRuntime.BinDirectory, pero eso fue fácil de determinar en el depurador, una vez que probé lo que mencionaste en tu respuesta.
Kent Weigel
Si uso `Server.MapPath (" ~ Whatever ") y el sitio de IIS está alojado en myserver . Obtengo un C: \\ somefolder \ Whatever, en lugar de myserver / Whatever folder.
Si8
@ Si8: Sí; eso es lo que Server.MapPathhace. Quieres stackoverflow.com/q/5823847/34397
SLaks
2
En caso de que no esté familiarizado con los ensamblados de .NET (o se encuentre en la ventana inmediata), los comandos completos son System.Web.HttpRuntime.AppDomainAppPathySystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
patrón de prueba
2
@testpattern HttpContextes System.Web.HttpContext.Current.Server.MapPath("~"), no tieneHttpRuntime
chengzi
112

Utilice este código:

 HttpContext.Current.Server.MapPath("~")

Referencia detallada:

Server.MapPath especifica la ruta relativa o virtual para mapear a un directorio físico.

  • Server.MapPath(".") devuelve el directorio físico actual del archivo (por ejemplo, aspx) que se está ejecutando
  • Server.MapPath("..") devuelve el directorio padre
  • Server.MapPath("~") devuelve la ruta física a la raíz de la aplicación
  • Server.MapPath("/") devuelve la ruta física a la raíz del nombre de dominio (no es necesariamente la misma que la raíz de la aplicación)

Un ejemplo:

Supongamos que apuntó una aplicación de sitio web ( http://www.example.com/ ) a

C:\Inetpub\wwwroot

e instaló la aplicación de su tienda (sub web como directorio virtual en IIS, marcado como aplicación) en

D:\WebApps\shop

Por ejemplo, si llama Server.MapPathen la siguiente solicitud:

http://www.example.com/shop/products/GetProduct.aspx?id=2342

luego:

Server.MapPath(".") returns D:\WebApps\shop\products
Server.MapPath("..") returns D:\WebApps\shop
Server.MapPath("~") returns D:\WebApps\shop
Server.MapPath("/") returns C:\Inetpub\wwwroot
Server.MapPath("/shop") returns D:\WebApps\shop

Si Path comienza con una barra inclinada hacia delante (/) o hacia atrás (), el MapPathmétodo devuelve una ruta como si Path fuera una ruta virtual completa.

Si la ruta no comienza con una barra, el MapPathmétodo devuelve una ruta relativa al directorio de la solicitud que se está procesando.

Nota: en C #, @ es el operador de cadena literal literal, lo que significa que la cadena debe usarse "tal cual" y no procesarse para secuencias de escape.

Notas al pie

Server.MapPath(null)y Server.MapPath("")producirá este efecto también.

Harshal Doshi Jain
fuente
17
Copia perfecta de stackoverflow.com/questions/275781/…
GGO
3
@GGO ¡Buen enlace! Siguiendo los enlaces, que terminé haciendo System.Web.Hosting.HostingEnvironment.MapPath("~")su lugar, que funciona muy bien, sin dependencia deSystem.Web.HttpContext.Current
Max Barraclough