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.

Chet
fonte

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.

womp
fonte
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

Yakir Manor
fonte
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.

Dan Diplo
fonte
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.

David McEwing
fonte
-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
soamazing
fonte
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 :)

Ahmad
fonte
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);
netuser
fonte
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

daudihus
fonte
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")
Debendra Dash
fonte