Usando Server.MapPath em classes externas de C # no ASP.NET


132

Estou tentando obter o caminho absoluto de certos arquivos em uma classe c #. Server.MapPathfunciona muito bem, é claro, para o ASPX e suas páginas de code-behind, mas isso não existe em outro arquivo de classe. Eu tentei HostingEnvironment.MapPath(), mas isso reclama que o caminho virtual relativo não é permitido. Alguma ideia?

System.Web já está importado.

Respostas:


302

A ServerUtilityclasse está disponível como uma instância no seu HttpContext. Se você estiver em um ambiente em que sabe que será executado dentro do pipeline do ASP.Net, poderá usar

HttpContext.Current.Server.MapPath()

Você terá que importar System.Webembora.


1
Mesmo que este post tenha mais de 2 anos, você me ajudou tremendamente. Obrigado.
precisa saber é o seguinte

6
E se não for executado nesse pipeline?
Zaitsman 5/05

Se você não estiver executando dentro do ASP.Net, é improvável que seu HttpContext esteja sendo definido, a menos que você tenha criado seu próprio pipeline :) Você precisará confiar nos métodos que o seu contexto de execução (roteador?) Fornecer. Se o seu processo tem informações básicas sobre o roteamento de caminho, você pode dar uma olhada nos métodos System.IO.Path.
Womp

Este contexto compilado, mas é nulo fora dos controladores, portanto, meus erros de código. Eu acho que o womp está dizendo a mesma coisa lá. Se for esse o caso, você pode acessar o MapPath fora dos roteadores?
edencorbin

34

você também pode usar:

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

E se

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

está inacessível


8

Você não pode simplesmente adicionar uma referência System.Webe então pode usar Server.MapPath?

Edit: Hoje em dia eu recomendo usar o HostingEnvironment.MapPathmétodo :

É um método estático na System.Webmontagem que mapeia um caminho virtual para um caminho físico no servidor. Ele não requer uma referência a HttpContext.


Não em classes externas.
funwhilelost

Claro que você pode adicionar a referência a uma classe externa; mas obviamente você precisa usá-lo no contexto de uma solicitação do servidor, para que o HttpContext não seja nulo.
Dan Diplo 21/07

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

Se o arquivo que você está tentando obter é o local da montagem para um tipo. Mas se os arquivos forem relativos ao local da montagem, você poderá usá-lo com System.IOespaço para nome para obter o caminho exato do arquivo.


-1: O que o levou a acreditar que ele queria a localização de uma assembléia?
John Saunders

1
Ele disse que "certos arquivos" não especificou o local ou a natureza dos arquivos, portanto, saber o local da montagem e poder trabalhar em relação a esse caminho pode ser útil. É claro que se ele realmente declarasse que ainda estava em um HttpContext, eu não me incomodaria em responder.
David McEwing 27/07/2009

David McEwing, o que você sugere não funcionará porque o IIS não carrega os assemblies no local em que você os instala, no site. Eles são copiados e carregados de um local temporário de cache do asp.net, portanto, fazer um GetAssembly ou GetExecutingAssembly direcionará você para o local do assembly, mas não terá nada a ver com o local do site apontado pelo MapPath.
Zumalifeguard

4

Eu também uso isso:

System.Web.HTTPContext.Current.Server.MapPath

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

Agora, quando você chama o método a partir do código

por exemplo :

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

            test.useServerPath(path);
}

dessa maneira seu código é simples e com um método você pode usar múltiplos caminhos para cada chamada :)


3

Este ajudou para mim

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

Bem-vindo ao stackoverflow. Um pouco mais de explicação ajudaria os colegas programadores a entender por que a solução funcionou.
NJInamdar

1

Esteja você executando no contexto do ASP.NET ou não, poderá usar HostingEnvironment.ApplicationPhysicalPath


0

O server.mappath ("") funcionará na página aspx, se você quiser obter o caminho absoluto de um arquivo de classe, precisará usar isso-

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.