71 votes

Quelle est la meilleure façon d'obtenir le chemin d'accès de l'exe en cours d'exécution dans .NET ?

À partir du programme a.exe situé dans c:/dir, je dois ouvrir le fichier texte c:/dir/text.txt. Je ne sais pas où a.exe pourrait se trouver, mais text.txt sera toujours dans le même chemin. Comment obtenir le nom de l'assemblage en cours d'exécution à l'intérieur du programme lui-même afin de pouvoir accéder au fichier texte ?

EDITAR : et si a.exe est un service Windows ? Il n'a pas d'application car il ne s'agit pas d'une application Windows.

Merci d'avance.

142voto

Tim S. Van Haren Points 5936

J'accède généralement au répertoire qui contient le fichier .exe de mon application avec :

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

2 votes

Moi aussi, et après avoir vu les autres réponses, j'ai l'impression d'avoir manqué un truc !

6 votes

Pour ceux qui essaient la ligne ci-dessus dans LINQPad et obtiennent une NullReferenceException, Assembly.GetEntryAssembly() renvoie une valeur nulle dans LINQPad mais dans votre propre application .NET, elle devrait renvoyer une valeur non nulle.

14 votes

Attention, ce code ne fonctionne pas s'il est exécuté à l'intérieur d'un test MS : dans ce cas, GetEntryAssembly() renvoie null et le code échoue.

14voto

Winston Smith Points 12029
string exePath = Application.ExecutablePath;
string startupPath = Application.StartupPath;

EDIT - Sans utiliser d'objet d'application :

string path = System.IO.Path.GetDirectoryName( 
      System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );

Voir ici pour plus d'informations :

http://msdn.microsoft.com/en-us/library/aa457089.aspx

3 votes

Je veux juste souligner que le Application est situé dans le System.Windows.Forms espace de noms - voir : msdn.microsoft.com/fr/us/library/

0 votes

Qu'en est-il de WPF ? l'application ne contient pas de méthode StartupPath ? ?!!

5voto

Tommy Carlier Points 3954

4voto

peSHIr Points 3911

Obtenez l'assemblage qui vous intéresse (par exemple, assigné à une System.Reflection.Assembly a variable) :

  • System.Reflection.Assembly.GetEntryAssembly() ou
  • typeof(X).Assembly pour une classe X qui se trouve dans l'assemblage qui vous intéresse (pour Windows Forms, vous pourriez utiliser typeof(Program) )

Obtenez ensuite le chemin d'accès au fichier à partir duquel l'assemblage a été réalisé. a a été chargé à partir de :

  • System.IO.Path.GetDirectoryName(a.Location)

El Application à partir d'une application Windows Forms est également une possibilité, comme expliqué dans d'autres réponses.

-1voto

baeltazor Points 1588
MessageBox.Show("This program is located in: " + Environment.CurrentDirectory);

27 votes

Puisque vous avez été rejeté (pas par moi), vous aimeriez peut-être savoir pourquoi. La propriété du répertoire actuel peut être définie dans le code, ce qui peut changer. Il peut également être différent si l'application est lancée à partir d'un raccourci.

12 votes

Merci pour le commentaire. Et pour l'explication :-)

1 votes

A tous ceux qui verront cela à l'avenir, mettons-nous d'accord pour garder cela ici comme un exemple de ce qu'il ne faut pas essayer et pourquoi, et mettons-nous d'accord pour upvoter l'humble réponse de jay pour au moins le nombre de fois que cela sera déclassé, puisqu'au moins il reconnaît la raison, maintenant, que cela ne fonctionne pas :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X