Devo usar AppDomain.CurrentDomain.BaseDirectory ou System.Environment.CurrentDirectory?

86

Eu tenho dois arquivos exe na mesma pasta, posso executar exe2 a partir de um botão no exe1. Hoje eu estava observando um cliente em uma sessão remota (serviços de terminal) e exe2 falhou ao executar o erro 'Arquivo não encontrado', mas exe1 estava no mesmo diretório quando verificamos. Portanto, devo usar AppDomain.CurrentDomain.BaseDirectory ou System.Environment.CurrentDirectory ?

obrigado

Nathan Baulch
fonte
@Jade M Como você está executando seu exe1 no terminal?
Sra. Sonia,
Quero acrescentar meus dois centavos dizendo que string.GetFullPath(path)usa em Environment.CurrentDirectoryvez de CurrentDomain.BaseDirectory, para minha surpresa.
JBSnorro

Respostas:

185

Se você deseja localizar arquivos no mesmo diretório de seu aplicativo, AppDomain.CurrentDomain.BaseDirectoryé a escolha correta.

Environment.CurrentDirectoryé um valor que pode e irá mudar durante a execução de seu aplicativo. Por exemplo, usando parâmetros padrão, o OpenFileDialog em WinForms irá alterar este valor para o diretório de onde o arquivo foi selecionado.

JaredPar
fonte
Usei o botão1 para mostrar OpenFileDialog, depois o botão2 para mostrar Environment.CurrentDirectory, mas ainda mostro a pasta de depuração, por quê?
Lei Yang
18

AppDomain.CurrentDomain.BaseDirectoryretorna o diretório de onde o domínio do aplicativo atual foi carregado.
System.Environment.CurrentDirectoryretorna o diretório do sistema atual.
No seu caso AppDomain.CurrentDomain.BaseDirectoryé a melhor solução.

Albert
fonte
1
Para ficar claro, System.Environment.CurrentDirectory retorna o diretório de trabalho atual (específico do processo) .
Oskar Berggren,
14

Você deve usar AppDomain.CurrentDomain.BaseDirectory.

Por exemplo, em um aplicativo de serviços do Windows:

System.Environment.CurrentDirectoryretornará C: \ Windows \ system32

Enquanto

AppDomain.CurrentDomain.BaseDirectory retornará [localização do Application.exe]

Outro fator importante a ser observado é que AppDomain.CurrentDomain.BaseDirectoryé uma propriedade somente leitura, enquanto Environment.CurrentDirectorypode ser outra coisa, se necessário:

// Change the directory to AppDomain.CurrentDomain.BaseDirectory
Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;   
Dalorzo
fonte
6

Pelo que entendi, você deve usar BaseDirectory. CurrentDirectorypode mudar ao longo da execução do programa.

Joel Coehoorn
fonte
2

Eu geralmente uso algo como:

            string AppPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            AppPath = AppPath.Replace("file:\\", "");
Zahymaka
fonte
2

Eu também passei por isso alguns dias atrás, como estava usando

Environment.CurrentDirectory

pois estava me dando problemas no servidor de produção, mas estava funcionando bem com meu servidor local,

Então, eu tentei com

System.AppDomain.CurrentDomain.BaseDirectory;

E funcionou para mim tanto no Meio Ambiente.

Então, como todos eles disseram, devemos sempre ir com

System.AppDomain.CurrentDomain.BaseDirectory;

enquanto verifica o diretório do Domínio Atual para o caminho.

dê uma olhada para mais informações

Não foi possível encontrar uma parte do erro de caminho no servidor

hud
fonte