2012-03-15 21 views

Respuesta

9

Si realmente necesita la ruta abuelo, usted puede obtener de la ruta raíz usando Path.GetDirectoryName():

string root = Server.MapPath("~"); 
string parent = Path.GetDirectoryName(root); 
string grandParent = Path.GetDirectoryName(parent); 

Pero su aplicación web muy probable que no tenga permiso para leer o escribir allí - No estoy seguro de lo que vas a hacer con eso.

+2

root, parent y grandParent devuelven todos la misma ruta. ¿Por qué? –

+1

¿De verdad? No tengo un sitio ASP.NET a mano para probar esto, pero probé un ejemplo en LinqPad comenzando desde c: \ inetpub \ wwwroot \ myapp y funcionó bien.Me sorprendería si Path estuviera configurado para restringirte, después de todo solo está procesando una cadena. Así que no he probado esto en el entorno exacto, pero estoy sorprendido de que no solo funcione. (Me doy cuenta ahora que mi código asume que root no tiene una barra inclinada: es posible que necesite otro Path.GetDirectoryName para deshacerse de eso si existe). – Rup

3

Comience con la raíz de su sitio con ~ y especifique la ruta completa: ~/Archive/Content.

No puede volver a la raíz del sitio anterior debido a restricciones de seguridad, consulte también this article de otras soluciones.

IIS evita deliberadamente la publicación de contenido directamente fuera de la ruta del sitio. Sin embargo, puede crear un directorio virtual en IIS y tener un punto de reescritura ISAPI para eso. Por ejemplo, cree un directorio virtual llamado/staticfiles que apunte a c: \ test \ data \ static-files. En lo que respecta a IIS, eso está directamente fuera de la raíz del sitio en una carpeta llamada/staticfiles.

+0

¿Cómo me ayuda esto? No retrocede. –

+0

Regresa donde? Especifique la ruta de ** Contenido ** a partir de la raíz del sitio web. –

+0

El archivo en el que estoy escribiendo el comando no está en el mismo proyecto que el sitio web. –

3

Puede utilizar Parent.Parent.FullName

string grandParent = new DirectoryInfo(HttpContext.Current.Server.MapPath("~/")).Parent.Parent.FullName; 
0

dado que está utilizando MapPath usted está consiguiendo volverá una ruta física (\) de una ruta de acceso virtual (/).

Crear un objeto DirectoryInfo o utilizar un método de utilidad Path que comience desde la raíz de la aplicación secundaria no necesariamente le dará lo que espera a menos que su padre virtual y abuelo virtual tengan la misma jerarquía que su estructura de directorio físico.

Mis aplicaciones no están anidadas físicamente para que coincidan con la profundidad de la Url. Este también podría ser el caso si se trata de un directorio virtual.

Suponiendo una aplicación abuelo es dos carpetas virtuales hasta esto sería conseguir que la ruta física ...

string physicalGrandparentPath = HttpContext.Current.Server.MapPath("~/../../"); 

Usando este sería mantenerse a salvo de cualquier juego de directorios virtuales de reproducción aleatoria que tienen lugar en la configuración de IIS.

Lo usé para ver qué tan lejos podía subir. No obtuve una HttpException hasta que intenté ir por encima de wwwroot.

Cuestiones relacionadas