Отримання абсолютного шляху до виконуваного файлу за допомогою C #?


78

Погляньте на цей псевдокод:

string exe_path = system.get_exe_path()
print "This executable is located in " + exe_path

Якщо я буду будувати вищезазначену програму та розміщувати виконуваний файл C:/meow/, вона буде роздруковуватися This executable is located in C:/meow/кожного разу, коли вона буде запущена, незалежно від поточного робочого каталогу.

Як я міг легко досягти цього за допомогою C#?



Відповіді:


107

MSDN має статтю, в якій сказано використовувати System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; якщо вам потрібен каталог, скористайтеся System.IO.Path.GetDirectoryNameцим результатом.

Або є коротший Application.ExecutablePathваріант "Отримує шлях до виконуваного файлу, який запустив програму, включаючи ім'я виконуваного файлу", що може означати, що він трохи менш надійний залежно від запуску програми.


29
System.Reflection.Assembly.GetExecutingAssembly () отримає збірку EXE лише в тому випадку, якщо звідти вона викликана. GetEntryAssembly () отримає правильну збірку.
GraemeF

6
Це особливо важливо, якщо ви створюєте службу Windows, оскільки послуга запускається з C: \ Windows \ System32, тож у вас буде цей робочий каталог. Я замість цього застосую метод GraemeF.
kevindaub

55
Вищезгаданий метод повертає поточний шлях як URI (тобто "файл: // c: \\ дані"). Що спрацювало, так це: System.Path.GetDirectoryName( Assembly.GetExecutingAssembly().Location ) );
arikfr

18
Це насправді "System.IO.Path". Тож повне ім’я з правильним простором імен має бути: System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly (). Розташування)
Віктор Челару,

9
noelicus: відповідно до відповіді та коментарів, безпечним і точним методом, який майже завжди буде коректно працювати, є: System.IO.Path.GetDirectoryName (System.Reflection.Assembly.GetEntryAssembly (). Розташування)
Грем Лайт

55
AppDomain.CurrentDomain.BaseDirectory

9
Це найкраща, найпростіша відповідь. Цей метод працює на Linux / mono та Windows, незалежно від поточного каталогу.
raider33

12
using System.Reflection;

string myExeDir = new FileInfo(Assembly.GetEntryAssembly().Location).Directory.ToString();

1
Приємно, хоча це можна спростити System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), що також швидше.
mklement0

4

"Отримує шлях або розташування UNC завантаженого файлу, що містить маніфест."

Див .: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.location.aspx

Application.ResourceAssembly.Location

Зверніть увагу, що це рішення є специфічним для WPF: " Applicationє класом, який інкапсулює функціональність певної програми WPF".
mklement0

4
var dir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

Я стрибнув за найвищою оцінкою відповіді і виявив, що не отримав того, що очікував. Мені довелося прочитати коментарі, щоб знайти те, що я шукав.

З цієї причини я публікую відповідь, перераховану в коментарях, щоб надати їй належну експозицію.


1
Приємно, хоч і повинно бути .GetEntryAssembly(), ні .GetExecutingAssembly().
mklement0

2

Припустимо, у мене є файл .config у програмі консолі, і тепер я отримую, як показано нижче.

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\YourFolderName\\log4net.config";

2
CurrentDirectory не гарантується тим каталогом, в якому виконується програма.

3
Будь ласка, використовуйте Path.Combine. Там багато коду, який не працює належним чином у Mono із таких комбінованих вручну шляхів.
Джозеф Леннокс,

1

Зі свого боку я використовував із заявкою на форму:

String Directory = System.Windows.Forms.Application.StartupPath;

він займає шлях запуску програми.


0

Той, який працював у мене і не був вище, був Process.GetCurrentProcess().MainModule.FileName.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.