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?

user2214609
la source

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);
Thorsten Dittmar
la source
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.

hakan
la source
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.

kmote
la source
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
24

Essaye ça:

System.Environment.CurrentDirectory

Hossein Narimani Rad
la source
1
Environment.CurrentDirectorypeut être modifié de plusieurs façons ... (paramètres de coupure de tir, etc.)
Yousha Aleayoub
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.

Soner Gönül
la source
19

Utilisez ceci,

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

Vous pouvez également l'utiliser.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
fhnaseer
la source
9

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

(en remplacement de AppDomain.CurrentDomain.BaseDirectory)

yonatan
la source
6

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory
Tomtom
la source
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);

Howard Rothenburg
la source
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).

Keisha W
la source