Vejo que existem algumas maneiras de obter o caminho da pasta do aplicativo:
Application.StartupPath
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
AppDomain.CurrentDomain.BaseDirectory
System.IO.Directory.GetCurrentDirectory()
Environment.CurrentDirectory
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
System.IO.Path.GetDirectory(Application.ExecutablePath)
Qual é a melhor maneira, dependendo da situação?
IHostEnvironment.ContentRootPath
, acessado através de umaIHostEnvironment
dependência injetada (que contém outras coisas úteis).Respostas:
AppDomain.CurrentDomain.BaseDirectory
é provavelmente o mais útil para acessar arquivos cuja localização é relativa ao diretório de instalação do aplicativo.Em um aplicativo ASP.NET, este será o diretório raiz do aplicativo, não a subpasta bin - que provavelmente é o que você normalmente deseja. Em um aplicativo cliente, será o diretório que contém o executável principal.
Em um aplicativo VSTO 2005, ele será o diretório que contém os assemblies gerenciados do VSTO para seu aplicativo, e não, por exemplo, o caminho para o executável do Excel.
Os outros podem retornar diretórios diferentes, dependendo do seu ambiente - por exemplo, consulte a resposta de @ Vimvq1987.
CodeBase
é o local em que um arquivo foi encontrado e pode ser um URL que começa com http: //. Nesse casoLocation
, provavelmente será o cache de download do assembly. Não é garantido que o CodeBase seja definido para assemblies no GAC .fonte
Path.Combine
. Isso cuidará da barra invertida à direita para você.Application.StartupPath
e 7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)
- Funciona apenas para aplicativos Windows FormsSystem.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
Vai lhe dar algo como:
"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"
que é onde está a página que você está executando.AppDomain.CurrentDomain.BaseDirectory
para aplicação web pode ser útil e retornará algo como"C:\\hg\\Services\\Services\\Services.Website\\"
qual é o diretório base e é bastante útil.System.IO.Directory.GetCurrentDirectory()
e 5.Environment.CurrentDirectory
fornecerá a localização de onde o processo foi acionado - portanto, para o aplicativo Web em execução no modo de depuração do Visual Studio, algo como
"C:\\Program Files (x86)\\IIS Express"
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
o local onde
.dll
o código está sendo executado, para aplicativos da web que possam ser"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"
Agora, no caso de, por exemplo, os pontos 2 a 6 do aplicativo de console estarão no diretório em que o
.exe
arquivo está.Espero que isso poupe algum tempo.
fonte
Observe que nem todos esses métodos retornarão o mesmo valor. Em alguns casos, eles podem retornar o mesmo valor, mas tenha cuidado, seus propósitos são diferentes:
retorna o
StartupPath
parâmetro (pode ser definido ao executar o aplicativo)retorna o diretório atual, que pode ou não ser a pasta em que o aplicativo está localizado. O mesmo vale para
Environment.CurrentDirectory
. Caso você esteja usando isso em um arquivo DLL, ele retornará o caminho de onde o processo está sendo executado (isso é especialmente verdade no ASP.NET).fonte
GetCurrentDirectory()
, pelo amor de executar as coisas de diferentes caminhos! :(Para um aplicativo Web, para obter o diretório raiz do aplicativo Web atual, geralmente chame por página da Web a solicitação de entrada atual:
Descrição do código acima
fonte
Iniciei um processo a partir de um Serviço do Windows pela API do Win32 na sessão do usuário que realmente está conectado (na sessão 1 do Gerenciador de Tarefas, não 0). Nesse caso, podemos conhecer qual variável é a melhor.
Para todos os 7 casos da pergunta acima, os seguintes são os resultados:
Talvez seja útil para alguns de vocês, fazendo o mesmo, ao pesquisar a melhor variável para o seu caso.
fonte
Na minha experiência, a melhor maneira é uma combinação desses.
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
Vai lhe dar a pasta binDirectory.GetCurrentDirectory()
Funciona bem no .Net Core, mas não no .Net e fornece o diretório raiz do projetoSystem.AppContext.BaseDirectory
eAppDomain.CurrentDomain.BaseDirectory
funciona bem no núcleo .Net, mas não no .Net e fornecerá o diretório raiz do projetoEm uma biblioteca de classes que deveria direcionar os núcleos Net e .Net, verifico qual estrutura está hospedando a biblioteca e escolho uma ou outra.
fonte
Eu usei este com sucesso
Funciona mesmo dentro do linqpad.
fonte
Diretório raiz:
fonte
Se você souber obter o diretório raiz:
fonte
este
System.IO.Path.GetDirectory(Application.ExecutablePath)
mudou paraSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)
fonte