Отримання каталогу програми з програми WPF


170

Я знайшов рішення для Windows Forms з AppDomain, але що було б еквівалентом для Applicationоб'єкта WPF ?

Відповіді:


329

Один метод:

System.AppDomain.CurrentDomain.BaseDirectory

Ще один спосіб зробити це:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

Ах, дякую. Повинен якось не помітити AppDomain. Я шукав це, насправді ...
Joey

3
@Helen: Судячи з результатів, це, очевидно, відмінна відповідь. Однак у відповіді є два способи отримання програми програми. Чи будуть вони обоє працювати однаково добре?
Крістофер Летте

21
Я б застосував першу альтернативу. Це виглядає простіше, не має виклику методу і викликає менше сумнівів у тому, що насправді робить рядок під час читання.
Філіп

3
Я використовував перший метод у службі WCF, у додатку WPF та в проекті «Бібліотека класів» і добре працював у всьому.
Апострофікс

1
Для NetCore та NetStandard я рекомендував би другий, тому що AppDomain був доданий у 2.0 та не завжди може бути встановлений так, як очікувалося
cdie

28

Ось ще:

System.Reflection.Assembly.GetExecutingAssembly().Location

2
Це місце отримує після тіньового копіювання , як зазначено в документах . Я насправді не впевнений, чи вплине на пропозиції у прийнятій відповіді тіньове копіювання.
Крістофер Летте

2
Це дало мені підкаталог DLL, який я викликав, а не основний каталог програм.
strattonn

7

Ви також можете використовувати перший аргумент аргументів командного рядка:

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


1
Однак зауважте, що "злий" додаток може змінювати аргументи його командного рядка.
Даніель Роуз

@Daniel: Чому це зробив би сам собі? Або ви маєте на увазі інший додаток?
Мерлін Морган-Грехем

1
@Merlyn: Дивіться blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspx Я цитую: це "зручно ініціалізований параметр до стартового коду процесу". Таким чином, ви можете свідомо чи ненавмисно змінити це місце в пам'яті.
Даніель Роуз

1
@Daniel: Хто може? Ще один процес, чи той самий процес? Якщо ви стріляєте собі в ногу, це слід легко відстежити. Я б назвав це менш злим і більш дурним :) Якщо інший процес може це зробити, то це цікавіше. Редагувати: У цій статті я нічого не бачу про зміну командного рядка запущеної програми - лише про те, що процес запуску передає його (не впевнений, що процес запуску не бажає змінювати командний рядок), і що ви можете запитувати його через WMI.
Мерлін Морган-Грехем

@ MerlynMorgan-Graham шкідливий додаток може змінити адресу пам'яті та змусити вашу програму замість цього запустити ще одне їх шкідливе додаток. Це зло, тому що скажімо, що їх додаток є кейлоггером, і вони хочуть, щоб він активувався, як тільки ви відкриєте окремий додаток. Таким чином, у їхньому коді вони захоплять назву вашої програми, запускають їх келог-файл у фоновому режимі, а потім запускають вашу програму. Користувач буде незрозумілим. Стаття справді пояснює це, але не говорить вам, як це зробити. Можливо, саме це ви шукали?
pqsk

6

Я використовував просто string baseDir = Environment.CurrentDirectory;і його роботу для мене.

Щасти

Редагувати:

Я раніше видаляв цей тип помилки, але я вважаю за краще редагувати її, тому що я думаю, що мінусова точка у цій відповіді допомагає людям дізнатися про неправильний шлях. :) Я зрозумів, що наведене вище рішення не є корисним, і я змінив його на string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Інші способи його отримання:

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

Щасти


3
Це поточний робочий каталог. Це може поєднуватися з каталогом додатків, але це окремі поняття (і найголовніше, що робочий каталог може змінюватися, наприклад, якщо у вас було відкрито загальне діалогове вікно файлів).
Джої

1
@joey ви праві. Я змінив це на це: string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; Дякую.
QMaster

3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

Спробуйте це!


3

Спробуйте це. Не забувайте using System.Reflection.

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

1

Я спробував це:

    label1.Content = Directory.GetCurrentDirectory();

і отримати також каталог.


При цьому отримується поточний робочий каталог, який може відрізнятися від каталогу процесів.
Thraka

Я думаю, що я повинен оцінити Directory.GetCurrentDirectory (); більше. Дякую @Thraka за виправлення.
Павло

0

Ви також можете вільно використовувати Application.StartupPath від System.Windows.Forms, але вам потрібно додати посилання на збірку System.Windows.Forms!

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