Obtenir le chemin du dossier actuel


222

Je veux créer un programme qui convertit les fichiers. Je voudrais que l'utilisateur puisse placer le fichier exécutable dans n'importe quel répertoire, et lors de l'exécution de ce programme (double-cliquant sur le .exe), je veux que le programme traite tous les fichiers dans le dossier actuel où le fichier exe existe . Comment le programme peut-il déterminer le chemin dans lequel il s'exécute actuellement?

J'ai essayé System.Windows.Forms.Application.StartupPathmais cela semble être la mauvaise façon.

Des idées?

Réponses:


334

Vous ne devez pas utiliser Directory.GetCurrentDirectory()dans votre cas, car le répertoire en cours peut différer du dossier d'exécution, en particulier lorsque vous exécutez le programme via un raccourci.

Il vaut mieux l'utiliser Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);pour votre but. Cela renvoie le chemin d'accès où se trouve l'assembly en cours d'exécution.

Alors que mon approche suggérée vous permet de faire la différence entre l'assemblage d'exécution, l'assemblage d'entrée ou tout autre assemblage chargé, comme l'a dit Soner Gönül dans sa réponse,

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

peut également suffire. Ce serait égal à

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

10
GetEntryAssembly () et GetExecutingAssembly () a une différence intéressante. Pour plus de détails, reportez-vous à stackoverflow.com/a/18562036/30289
bhadra

3
Comme je l'ai dit: cela renvoie le chemin d'accès où réside l' assembly en cours d'exécution . La différence entre GetEntryAssemblyet GetExecutingAssemblyne surprend pas autant, est également évidente par le nom de la fonction. S'ils faisaient de même, pourquoi y aurait-il deux fonctions? :-)
Thorsten Dittmar

2
+1 Assembly.GetEntryAssembly () m'a aidé en cas d'exécution de l'application via clickonce
Artiom

9
C'est dans System.Reflection, tout System.Reflection.Assembly.GetExecutingAssembly().Locationcomme le test complet - si vous testez à partir de la fenêtre immédiate
The Red Pea

147
System.AppDomain.CurrentDomain.BaseDirectory

Cela vous donnera un répertoire en cours d'exécution de votre application. Cela fonctionne même pour les applications Web. Ensuite, vous pouvez accéder à votre fichier.


9
Il s'agit de la propriété la plus précise à utiliser à cette fin. BaseDirectory du CurrentDomain pointera toujours vers l'emplacement correct même si le AppDomain est créé dynamiquement pour rechercher les assemblys à partir d'un emplacement différent.
dhruvin

Parfait. Cela fonctionne indépendamment pour n'importe quelle application, en particulier lors de l'utilisation de Streamreader, qui peut lire différents chemins absolus en fonction du type d'application.
user3326078

40

J'ai créé une application console simple avec le code suivant:

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

J'ai copié l'exécutable résultant vers C:\temp2. J'ai ensuite placé un raccourci vers cet exécutable dans C:\temp3et l' ai exécuté (une fois depuis l'exe lui-même et une fois depuis le raccourci). Il a donné les résultats suivants les deux fois:

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

Bien que je sois sûr qu'il doit y avoir une raison de cockamamie pour expliquer pourquoi il existe cinq méthodes différentes qui font pratiquement la même chose, je ne sais certainement pas ce que c'est. Néanmoins, il semblerait que dans la plupart des cas, vous êtes libre de choisir celui qui vous convient.

MISE À JOUR: J'ai modifié les propriétés du raccourci, en changeant le champ "Démarrer dans:" en C:\temp3. Cela a abouti à la sortie suivante:

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

... qui démontre au moins certaines des distinctions entre les différentes méthodes.


2
Merci beaucoup.
baj9032

Une note importante. Le répertoire de travail ne sera pas toujours le même que le répertoire installé.
Jordan


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

De Path.GetDirectoryName

Renvoie les informations de répertoire pour la chaîne de chemin d'accès spécifiée.

De Application.ExecutablePath

Obtient le chemin d'accès au fichier exécutable qui a démarré l'application, y compris le nom de l'exécutable.


19

Utilisez ceci,

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

Vous pouvez également l'utiliser.

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

9

pour l' utilisation de .NET CORESystem.AppContext.BaseDirectory

(en remplacement de AppDomain.CurrentDomain.BaseDirectory)


6

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory

Environment.CurrentDirectorypeut être modifié de plusieurs façons ... (paramètres de coupure de tir, etc.)
Yousha Aleayoub


0

Si vous voulez le chemin exe que vous pouvez utiliser System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);


0

Cela fonctionne mieux pour moi, en particulier lors de l'utilisation de la publication d'un seul fichier dotnet core. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.