Obtenir le répertoire de l'application à partir d'une application WPF

170

J'ai trouvé des solutions pour Windows Forms avec AppDomain mais quel serait l'équivalent d'un Applicationobjet WPF ?

Joey
la source

Réponses:

329

Une méthode:

System.AppDomain.CurrentDomain.BaseDirectory

Une autre façon de procéder serait:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)
Hélène
la source
Ah merci. Doit avoir négligé AppDomain d'une manière ou d'une autre. Je le cherchais, en fait ...
Joey
3
@Helen: À en juger par les votes positifs, c'est évidemment une excellente réponse. Cependant, la réponse a deux façons d'obtenir le répertoire de l'application. Vont-ils tous les deux fonctionner aussi bien?
Christoffer Lette
21
J'utiliserais la première alternative. Il semble plus simple, n'a pas d'appel de méthode et provoque moins de doute sur ce que fait réellement la ligne lors de la lecture.
Filip
3
J'ai utilisé la première méthode dans un service WCF, dans une application WPF et dans un projet de bibliothèque de classes et j'ai bien fonctionné dans l'ensemble.
Apostrofix
1
Pour NetCore et NetStandard, je recommanderais le deuxième, car AppDomain a été ajouté dans la version 2.0 et ne pouvait pas toujours être défini comme prévu
cdie
28

En voici une autre:

System.Reflection.Assembly.GetExecutingAssembly().Location
Eddie Butt
la source
2
Celui-ci obtient l'emplacement après la copie d'ombre , comme indiqué dans la documentation . Je ne sais pas vraiment si les suggestions de la réponse acceptée sont affectées par la copie d'ombre.
Christoffer Lette
2
Cela m'a donné le sous-répertoire de la DLL que j'appelais, pas le répertoire principal du programme.
strattonn
7

Vous pouvez également utiliser le premier argument des arguments de ligne de commande:

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

Retourner
la source
1
Cependant, notez qu'une application "diabolique" peut modifier ses arguments de ligne de commande.
Daniel Rose
@Daniel: Pourquoi le ferait-il à lui-même? Ou voulez-vous dire une application différente?
Merlyn Morgan-Graham
1
@Merlyn: Voir blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx Je vais citer: c'est un "paramètre commodément initialisé au code de démarrage du processus." Vous pouvez donc modifier délibérément ou par inadvertance cet emplacement mémoire.
Daniel Rose
1
@Daniel: Qui peut? Un autre processus, ou le même processus? Si vous vous tirez une balle dans le pied, il devrait être facile de le retrouver. J'appellerais ça moins maléfique et plus stupide :) Si un autre processus peut le faire, alors c'est plus intéressant. Edit: Je ne vois rien dans cet article sur la modification de la ligne de commande d'un programme en cours d'exécution - seulement que le processus de lancement le transmet (pas sûr qu'il n'est pas souhaitable que le processus de lancement change la ligne de commande), et que vous pouvez l'interroger via WMI.
Merlyn Morgan-Graham
@ MerlynMorgan-Graham une application malveillante peut modifier l'adresse mémoire et forcer votre application à exécuter une autre application malveillante à la place. C'est mal, car disons que leur application est un keylogger et qu'ils veulent qu'il s'active dès que vous ouvrez une application spécifique. Ainsi, dans leur code, ils captureront le nom de votre application, exécuteront leur keylogger en arrière-plan, puis exécuteront votre application. L'utilisateur n'aura aucune idée. L'article explique cela, mais il ne vous dit pas comment le faire. C'est peut-être ce que vous recherchiez?
pqsk
6

J'ai utilisé simplement string baseDir = Environment.CurrentDirectory;et son travail pour moi.

Bonne chance

Éditer:

J'avais l'habitude de supprimer ce type d'erreur, mais je préfère le modifier parce que je pense que le point négatif de cette réponse aide les gens à connaître le mauvais chemin. :) J'ai compris que la solution ci-dessus n'est pas utile et je l'ai changée en string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; D'autres moyens de l'obtenir sont:

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

Bonne chance

QMaster
la source
3
C'est le répertoire de travail actuel. Cela peut coïncider avec le répertoire de l'application, mais ce sont des concepts séparés (et surtout, le répertoire de travail peut changer, par exemple si vous aviez une boîte de dialogue de fichier commune ouverte).
Joey
1
@joey vous avez raison. Je l'ai changé en ceci: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Merci.
QMaster
3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

Essaye ça!

Arsen Mkrtchyan
la source
3

Essaye ça. N'oublie pas using System.Reflection.

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

J'ai essayé ceci:

    label1.Content = Directory.GetCurrentDirectory();

et obtenez également le répertoire.

Paul
la source
Cela obtient le répertoire de travail actuel, qui peut être différent du répertoire de processus.
Thraka
Je suppose que je dois évaluer Directory.GetCurrentDirectory (); plus. Merci @Thraka pour la correction.
Paul
0

Vous pouvez également utiliser librement Application.StartupPath de System.Windows.Forms, mais vous devez ajouter une référence pour l'assembly System.Windows.Forms!

crash
la source