Melhor maneira de obter o caminho da pasta do aplicativo


515

Vejo que existem algumas maneiras de obter o caminho da pasta do aplicativo:

  1. Application.StartupPath
  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. System.IO.Directory.GetCurrentDirectory()
  5. Environment.CurrentDirectory
  6. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  7. System.IO.Path.GetDirectory(Application.ExecutablePath)

Qual é a melhor maneira, dependendo da situação?


9
Por que temos muitas maneiras de obter o caminho do aplicativo. Eu acho que há uma razão para cada caminho.
Leo Vo

1
Há um erro no # 6: deve ler: System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase), System.IO.Path.GetDirectoryName (Application.ExecutablePath)
BillW

2
hooray para # 6, enquanto eu estou em um projeto web, eu não queria lógica Server.MapPath em meu IoC carregado biblioteca que não é específica da web na natureza
bkwdesign

Agora temos o confiável IHostEnvironment.ContentRootPath, acessado através de uma IHostEnvironmentdependência injetada (que contém outras coisas úteis).
Timo

Respostas:


519

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 caso Location, provavelmente será o cache de download do assembly. Não é garantido que o CodeBase seja definido para assemblies no GAC .


2
Ao testar no Windows XP 32 bits, ele retorna onde o atalho foi iniciado.
18713 Joshua Son

1
+1 @ Joe e para no nível do documento VSTO add-in ver ESTE

3
Esteja ciente de que isso retorna um caminho com uma barra invertida no final. Isso me causou problemas ao formatar uma string com o resultado para passar como um argumento do processo.
Avenmore #

19
@avenmore - Se você estiver formatando uma string para criar um caminho, considere usar Path.Combine. Isso cuidará da barra invertida à direita para você.
216 Joe Joe

1
Isso está retornando a pasta bin / debug para mim no VS 2017, não o diretório raiz.
SmoveBB

86
  1. Application.StartupPathe 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath)- Funciona apenas para aplicativos Windows Forms

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

  3. AppDomain.CurrentDomain.BaseDirectorypara aplicação web pode ser útil e retornará algo como "C:\\hg\\Services\\Services\\Services.Website\\"qual é o diretório base e é bastante útil.

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

  1. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

o local onde .dllo 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.


2
Certamente, querer que a "pasta atual" seja relevante apenas para aplicativos que não sejam da Web ...
Nyerguds

2
Essa é a resposta.
precisa

59

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:

Application.StartupPath

retorna o StartupPathparâmetro (pode ser definido ao executar o aplicativo)

System.IO.Directory.GetCurrentDirectory()

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


7
Por favor, por favor, não use GetCurrentDirectory(), pelo amor de executar as coisas de diferentes caminhos! :(
kayleeFrye_onDeck

@kayleeFrye_onDeck você não colocou suas razões para a pergunta anterior.
nless 11/10/19

10

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:

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Descrição do código acima


6

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:

Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram

Talvez seja útil para alguns de vocês, fazendo o mesmo, ao pesquisar a melhor variável para o seu caso.


4
Resposta muito relevante. Tantas pessoas esquecem que "diretório de trabalho"! = "Diretório de programa".
Nyerguds

3

Na minha experiência, a melhor maneira é uma combinação desses.

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase Vai lhe dar a pasta bin
  2. Directory.GetCurrentDirectory() Funciona bem no .Net Core, mas não no .Net e fornece o diretório raiz do projeto
  3. System.AppContext.BaseDirectorye AppDomain.CurrentDomain.BaseDirectory funciona bem no núcleo .Net, mas não no .Net e fornecerá o diretório raiz do projeto

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


2

Eu usei este com sucesso

System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

Funciona mesmo dentro do linqpad.


1
está faltando o colchete de abertura de GetCurrentProcess. btw for avaliado como C: \ Program Files \ dotnet no meu projeto principal .net durante a depuração no visual studio, porque é onde dotnet.exe está localizado
t0b4cc0

1

Diretório raiz:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;

1
Isso parece obter o diretório de trabalho atual, embora possa ser útil às vezes, definitivamente não é garantido que seja o caminho do EXE.
precisa saber é o seguinte

0

Se você souber obter o diretório raiz:

string rootPath = Path.GetPathRoot(Application.StartupPath)

0

este System.IO.Path.GetDirectory(Application.ExecutablePath)mudou paraSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)

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.