Obtendo o diretório atual no aplicativo da web .NET

105

Tenho um projeto da web e estou tentando obter o diretório raiz do site usando o método c # Directory.GetCurrentDirectory(). Não quero usar um caminho estático, pois os locais dos arquivos serão alterados no futuro. Este método está sendo executado em meu arquivo imageProcess.aspx.cs, mas onde pensei que retornaria:

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

Em vez disso, estou recebendo:

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

Alguém pode explicar por que isso está acontecendo e qual poderia ser uma possível solução? Muito obrigado.

Julian Coltea
fonte
Postagem relacionada aqui que fala sobre caminhos de execução de aplicativos .Net em geral.
RBT de

Respostas:

210

O diretório atual é um recurso de nível de sistema; ele retorna o diretório de onde o servidor foi iniciado. Não tem nada a ver com o site.

Você quer HttpRuntime.AppDomainAppPath.

Se você estiver em uma solicitação HTTP, também pode ligar Server.MapPath("~/Whatever").

SLaks
fonte
2
Obrigado. Eu estava procurando HttpRuntime.BinDirectory, mas foi fácil de determinar no depurador, depois que tentei o que você mencionou em sua resposta.
Kent Weigel
Se eu usar `Server.MapPath (" ~ Whatever ") e o site IIS estiver hospedado em myserver . Eu recebo um C: \\ alguma pasta \ Qualquer, em vez de minha pasta de servidor / Qualquer .
Si8
@ Si8: Sim; é isso que Server.MapPathfaz. Você deseja stackoverflow.com/q/5823847/34397
SLaks
2
Caso você não esteja familiarizado com os assemblies .NET (ou na janela Imediata), os comandos completos são System.Web.HttpRuntime.AppDomainAppPatheSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
testpattern
2
@testpattern HttpContextis System.Web.HttpContext.Current.Server.MapPath("~"), not haveHttpRuntime
chengzi
112

Use este código:

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

Referência detalhada:

Server.MapPath especifica o caminho relativo ou virtual para mapear para um diretório físico.

  • Server.MapPath(".") retorna o diretório físico atual do arquivo (por exemplo, aspx) sendo executado
  • Server.MapPath("..") retorna o diretório pai
  • Server.MapPath("~") retorna o caminho físico para a raiz do aplicativo
  • Server.MapPath("/") retorna o caminho físico para a raiz do nome de domínio (não é necessariamente o mesmo que a raiz do aplicativo)

Um exemplo:

Digamos que você direcionou um aplicativo de site ( http://www.example.com/ ) para

C:\Inetpub\wwwroot

e instalei seu aplicativo de loja (sub web como diretório virtual no IIS, marcado como aplicativo) em

D:\WebApps\shop

Por exemplo, se você ligar Server.MapPathna seguinte solicitação:

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

então:

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

Se Path começa com uma barra (/) ou uma barra invertida (), o MapPathmétodo retorna um caminho como se Path fosse um caminho virtual completo.

Se Path não começa com uma barra, o MapPathmétodo retorna um caminho relativo ao diretório da solicitação que está sendo processada.

Observação: em C #, @ é o operador literal literal de string, o que significa que a string deve ser usada "como está" e não deve ser processada para sequências de escape.

Notas de rodapé

Server.MapPath(null)e Server.MapPath("")produzirá esse efeito também.

Harshal Doshi Jain
fonte
17
Cópia perfeita de stackoverflow.com/questions/275781/…
GGO,
3
@GGO Bom link! Seguindo os links, acabei fazendo em System.Web.Hosting.HostingEnvironment.MapPath("~")vez disso, que funciona muito bem, sem dependência deSystem.Web.HttpContext.Current
Max Barraclough