2009-07-27 38 views
118

Estoy tratando de obtener la ruta absoluta de ciertos archivos en una clase C#. Server.MapPath funciona muy bien, por supuesto, para ASPX y sus páginas de código subyacente, pero eso no existe en otro archivo de clase. Intenté HostingEnvironment.MapPath(), pero eso se queja de que la ruta virtual relativa no está permitida. ¿Alguna idea?Usando Server.MapPath en clases C# externas en ASP.NET

System.Web ya se ha importado.

Respuesta

266

La clase ServerUtility está disponible como una instancia en su HttpContext. Si estás en un entorno en el que sabes que va a ser ejecutado dentro de la tubería ASP.Net, puede utilizar

HttpContext.Current.Server.MapPath() 

Vas a tener que importar System.Web sin embargo.

+1

Aunque esta publicación tiene más de 2 años, me has ayudado tremendamente. Gracias. – iarwain01

+6

¿Qué pasa si no se ejecuta en esa tubería? – zaitsman

+0

Si no está ejecutando dentro de ASP.Net entonces es poco probable que se configure su HttpContext, a menos que haya escrito su propia canalización :) Tendrá que depender de los métodos que su contexto de ejecución (enrutador?) Proporcione.Si su proceso tiene una idea de los aspectos básicos del enrutamiento de su ruta, puede echar un vistazo a los métodos System.IO.Path. – womp

8

¿No puede simplemente agregar una referencia a System.Web y luego puede usar Server.MapPath?

Editar: Hoy en día me gustaría recomendar el uso del HostingEnvironment.MapPath Method:

Es un método estático en System.Web montaje que se asigna una ruta de acceso virtual a una ruta física en el servidor. Es no requieren una referencia a HttpContext.

+0

No en clases externas. – funwhilelost

+0

Claro que puede agregar la referencia a una clase externa; pero obviamente necesita usarlo en el contexto de una solicitud de servidor para que HttpContext no sea nulo. –

4
System.Reflection.Assembly.GetAssembly(type).Location 

SI el archivo que intenta obtener es la ubicación de montaje para un tipo. Pero si los archivos son relativos a la ubicación del ensamblaje, puede usar esto con el espacio de nombre System.IO para obtener la ruta exacta del archivo.

+0

-1: ¿Qué lo llevó a creer que quería la ubicación de un conjunto? –

+1

Dijo "ciertos archivos" que no especificó la ubicación o naturaleza de los archivos, por lo que conocer la ubicación del ensamblado y poder trabajar en relación con esa ruta puede ser útil. Por supuesto, si él realmente declarara que todavía estaba en un HttpContext, entonces no me habría molestado en responder. –

+0

David McEwing, lo que sugiera no funcionará porque IIS no carga los ensamblajes desde la ubicación donde los instala, en el sitio web. Se copian y cargan desde una ubicación de caché de asp.net temporal, por lo que al hacer un GetAssembly o GetExecutingAssembly se lo dirigirá a la ubicación del ensamblado, pero no tendrá nada que ver con la ubicación del sitio web al que apunta MapPath. – zumalifeguard

2
class test 
{ 
public static void useServerPath(string path) 
{ 
    if (File.Exists(path) 
{ 
\\...... do whatever you wabt 
} 
else 
{ 
\\..... 
} 
} 

Ahora, cuando se llama al método desde el código subyacente

por ejemplo:

protected void BtAtualizacao_Click(object sender, EventArgs e) 
     { 
      string path = Server.MapPath("Folder") + "\\anifile.txt"; 

      test.useServerPath(path); 
} 

de esta manera su código es simple y con un método u puede utilizar varias rutas de acceso para cada llamada :)

3

utilizo esto también:

System.Web.HTTPContext.Current.Server.MapPath 
30

también puede utilizar:

var path = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/myfile.txt") 

si

var path = Server.MapPath("~/App_Data"); 
var fullpath = Path.Combine(path , "myfile.txt"); 

es inaccesible

3

Ésta ayudó para mí

//System.Web.HttpContext.Current.Server.MapPath //   
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/File.txt"), 
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); 
+0

Bienvenido a stackoverflow. Un poco más de explicación ayudaría a los compañeros programadores a entender por qué la solución funcionó. – Daenarys

1

Ya sea que esté corriendo en el contexto de ASP .NET o no, deberías poder usar HostingEnvironment.ApplicationP hysicalPath