Obtendo o diretório do aplicativo a partir de um aplicativo WPF

170

Encontrei soluções para Windows Forms com AppDomain, mas qual seria o equivalente para um Applicationobjeto WPF ?

Joey
fonte

Respostas:

329

Um método:

System.AppDomain.CurrentDomain.BaseDirectory

Outra maneira de fazer isso seria:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)
Helen
fonte
Ah obrigada. Deve ter esquecido o AppDomain de alguma forma. Eu estava procurando por ele, na verdade ...
Joey
3
@Helen: A julgar pelos votos positivos, esta é obviamente uma excelente resposta. No entanto, a resposta tem duas maneiras de obter o diretório do aplicativo. Ambos irão funcionar igualmente bem?
Christoffer Lette
21
Eu usaria a primeira alternativa. Parece mais simples, não possui uma chamada de método e causa menos dúvidas sobre o que a linha realmente faz ao ler.
Filip
3
Eu usei o primeiro método em um serviço WCF, em um Aplicativo WPF e em um projeto de Biblioteca de Classes e funcionou bem em tudo.
Apostrofix
1
Para Netcore e netstandard, eu recomendaria o segundo, porque AppDomain foi adicionado em 2,0 e não podia ser sempre definido como esperado
CDIE
28

Aqui está outro:

System.Reflection.Assembly.GetExecutingAssembly().Location
Eddie Butt
fonte
2
Este obtém o local após a cópia de sombra , conforme indicado nos documentos . Na verdade, não tenho certeza se as sugestões na resposta aceita são afetadas pela cópia de sombra.
Christoffer Lette
2
Isso me deu o subdiretório da DLL que eu estava chamando, não o diretório principal do programa.
strattonn
7

Você também pode usar o primeiro argumento dos argumentos da linha de comando:

String exePath = System.Environment.GetCommandLineArgs()[0]

Giro
fonte
1
No entanto, observe que um aplicativo "inválido" pode modificar seus argumentos de linha de comando.
Daniel Rose
@ Daniel: Por que isso faria para si mesmo? Ou você quer dizer uma aplicação diferente?
Merlyn Morgan-Graham
1
@ Merlyn: Veja blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx , citarei: é um "parâmetro convenientemente inicializado para o código de inicialização do processo". Portanto, você pode deliberadamente ou inadvertidamente modificar esse local da memória.
Daniel Rose
1
@ Daniel: Quem pode? Outro processo, ou o mesmo processo? Se você atirar no próprio pé, deve ser fácil rastrear. Eu chamaria isso de menos maligno e mais estúpido :) Se outro processo puder fazê-lo, isso será mais interessante. Editar: não vejo nada neste artigo sobre a modificação da linha de comando de um programa em execução - apenas que o processo de inicialização o transmite (não tenho certeza de que é indesejável para o processo de inicialização alterar a linha de comando) e que você pode consultá-lo via WMI.
Merlyn Morgan-Graham
@ MerlynMorgan-Graham, um aplicativo mal-intencionado pode modificar o endereço da memória e forçar seu aplicativo a executar outro aplicativo mal-intencionado. Isso é ruim, porque digamos que o aplicativo deles seja um keylogger e eles desejam que ele seja ativado assim que você abrir um aplicativo específico. Portanto, no código deles, eles capturam o nome do aplicativo, executam o keylogger em segundo plano e, em seguida, executam o aplicativo. O usuário não terá noção. O artigo explica isso, mas não explica como fazê-lo. Talvez fosse isso que você estava procurando?
pqsk
6

Eu usei simplesmente string baseDir = Environment.CurrentDirectory;e seu trabalho para mim.

Boa sorte

Editar:

Eu costumava excluir esse tipo de erro, mas prefiro editá-lo porque acho que o ponto negativo nesta resposta ajuda as pessoas a saber sobre o caminho errado. :) Entendi que a solução acima não é útil e mudei para string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Outras maneiras de obtê-la são:

1. string baseDir =   
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 2. String exePath = System.Environment.GetCommandLineArgs()[0];
 3. string appBaseDir =    System.IO.Path.GetDirectoryName
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

Boa sorte

QMaster
fonte
3
Esse é o diretório de trabalho atual. Pode estar de acordo com o diretório do aplicativo, mas esses são conceitos separados (e o mais importante, o diretório de trabalho pode mudar, por exemplo, se você tivesse uma caixa de diálogo de arquivo comum aberta).
Joey12
1
@ joey você está certo. Eu mudei para isso: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Obrigado.
QMaster
3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

Tente isso!

Arsen Mkrtchyan
fonte
3

Tente isso. Não se esqueça using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
Roshan J
fonte
1

Eu tentei isso:

    label1.Content = Directory.GetCurrentDirectory();

e obtenha também o diretório

Paulo
fonte
Isso obtém o diretório de trabalho atual, que pode ser diferente do diretório de processo.
Thraka
Eu acho que tenho que avaliar Directory.GetCurrentDirectory (); Mais. Obrigado @Thraka pela correção.
paul
0

Você também pode usar livremente Application.StartupPath de System.Windows.Forms, mas você deve adicionar referência ao assembly System.Windows.Forms!

batida
fonte