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.


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").


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.



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
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.