Obter o caminho da pasta atual


222

Eu quero criar um programa que converte arquivos. Gostaria que o usuário pudesse colocar o arquivo executável em qualquer diretório e, ao executar esse programa (clicando duas vezes em .exe), desejo que o programa processe todos os arquivos da pasta atual em que o arquivo exe existe . Como o programa pode determinar o caminho em que está sendo executado atualmente?

Eu tentei, System.Windows.Forms.Application.StartupPathmas isso parece ser o caminho errado.

Alguma ideia?

Respostas:


334

Você não deve usar Directory.GetCurrentDirectory()no seu caso, pois o diretório atual pode ser diferente da pasta de execução, especialmente quando você executa o programa através de um atalho.

É melhor usar Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);para o seu propósito. Isso retorna o nome do caminho em que o assembly atualmente em execução reside.

Embora minha abordagem sugerida permita a diferenciação entre a montagem em execução, a montagem de entrada ou qualquer outra montagem carregada, como Soner Gönül disse em sua resposta,

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

também pode ser suficiente. Isso seria igual a

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

10
GetEntryAssembly () e GetExecutingAssembly () tem uma diferença interessante. Para detalhes, consulte stackoverflow.com/a/18562036/30289
bhadra

3
Como eu disse: Isso retorna o nome do caminho onde o assembly atualmente em execução reside. A diferença entre GetEntryAssemblye GetExecutingAssemblynão surpreende, também é óbvia pelo nome da função. Se eles fizeram o mesmo, por que deveria haver duas funções? :-)
Thorsten Dittmar

2
+1 Assembly.GetEntryAssembly () me ajudou no caso de executar o aplicativo via clickonce #
Artiom

9
Isso está no System.Reflection, o mesmo System.Reflection.Assembly.GetExecutingAssembly().Locationocorre com o completo - se você estiver testando a partir de Janela imediata
The Red Pea

147
System.AppDomain.CurrentDomain.BaseDirectory

Isso lhe dará o diretório em execução do seu aplicativo. Isso funciona mesmo para aplicativos da web. Depois, você pode acessar seu arquivo.


9
Essa é a propriedade mais precisa a ser usada para esse fim. O BaseDirectory do CurrentDomain sempre apontará para o local correto, mesmo que o AppDomain seja criado dinamicamente para procurar os assemblies de um local diferente.
dhruvin

Perfeito. Isso funciona independentemente para qualquer aplicativo, especialmente ao usar o Streamreader, que pode ler diferentes caminhos absolutos, dependendo do tipo de aplicativo.
user3326078

40

Criei um aplicativo de console simples com o seguinte código:

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);

Copiei o executável resultante para C:\temp2. Coloquei um atalho para o executável em C:\temp3e o executei (uma vez do exe em si e outra vez do atalho). Ele forneceu as seguintes saídas nas duas vezes:

C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2

Embora tenha certeza de que deve haver algum motivo para explicar por que existem cinco métodos diferentes que fazem praticamente a mesma coisa, certamente não sei o que é. No entanto, parece que, na maioria das circunstâncias, você é livre para escolher o que quiser.

ATUALIZAÇÃO: modifiquei as propriedades do atalho, alterando o campo "Iniciar em:" para C:\temp3. Isso resultou na seguinte saída:

C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3

... o que demonstra pelo menos algumas das distinções entre os diferentes métodos.


2
Muito obrigado.
baj9032

Uma nota importante. O diretório de trabalho nem sempre será o mesmo que o diretório instalado.
Jordan


21
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

De Path.GetDirectoryName

Retorna as informações do diretório para a cadeia de caminho especificada.

De Application.ExecutablePath

Obtém o caminho para o arquivo executável que iniciou o aplicativo, incluindo o nome do executável.


19

Usa isto,

var currentDirectory = System.IO.Directory.GetCurrentDirectory(); 

Você pode usar isso também.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

9

para uso do .NET CORESystem.AppContext.BaseDirectory

(como um substituto para AppDomain.CurrentDomain.BaseDirectory)


6

1

Directory.GetCurrentDirectory();

2)

Thread.GetDomain().BaseDirectory

3)

Environment.CurrentDirectory

Environment.CurrentDirectorypode ser alterado de várias maneiras ... (configurações de shotrtcut, etc) #
Yousha Aleayoub


0

Se você deseja o caminho exe, pode usar System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);


0

Isso funciona melhor para mim, especialmente ao usar a publicação de arquivo único do dotnet core. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

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.