Отримати поточний шлях до папки


222

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

Я намагався, System.Windows.Forms.Application.StartupPathале це, здається, неправильний шлях.

Будь-які ідеї?

Відповіді:


335

Ви повинні НЕ використовувати Directory.GetCurrentDirectory()в вашому випадку, оскільки поточний каталог може відрізнятися від папки виконання, особливо при виконанні програми через ярлик.

Краще використовувати Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);для своїх цілей. Це повертає ім'я шляху, де перебуває поточна виконувана збірка.

Хоча мій запропонований підхід дозволяє вам розмежувати виконується збірку, вхідну збірку або будь-яку іншу завантажену збірку, як сказав Сонер Генюль у своїй відповіді:

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

може також бути достатнім. Це було б дорівнює

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

10
GetEntryAssembly () і GetExecutingAssembly () має цікаву різницю. Детальніше див stackoverflow.com/a/18562036/30289
Бхадра

3
Як я вже сказав: Це повертає ім'я шляху, де знаходиться поточна виконувана збірка . Різниця між сюрпризом GetEntryAssemblyі GetExecutingAssemblyне настільки сильною, очевидна також за назвою функції. Якщо вони зробили те саме, чому повинні бути дві функції? :-)
Торстен Діттмар

2
+1 Assembly.GetEntryAssembly () допоміг мені у випадку запуску програми за допомогою кліку
Artiom

9
Це в System.Reflection, так System.Reflection.Assembly.GetExecutingAssembly().Locationце повне - якщо ви тестуєте з негайного вікна
Червоний горох

147
System.AppDomain.CurrentDomain.BaseDirectory

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


9
Це найточніша властивість, яка використовується для цієї мети. BaseDirectory CurrentDomain завжди вказуватиме на правильне розташування, навіть якщо AppDomain динамічно створюється для перегляду складання з іншого місця.
дрювін

Ідеально. Це працює незалежно для будь-якого додатка, особливо при використанні Streamreader, який може читати різні абсолютні шляхи залежно від типу програми.
користувач3326078

40

Я створив просту консольну програму із наступним кодом:

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

Я скопіював отриманий виконуваний файл у C:\temp2. Потім я помістив ярлик до цього виконуваного файлу C:\temp3і запустив його (один раз із самого EXE і один раз із ярлика). Обидва рази давали такі результати:

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

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

ОНОВЛЕННЯ: Я змінив властивості ярлика, змінивши поле "Почати в:" на C:\temp3. Це призвело до наступного результату:

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

... що демонструє принаймні деякі відмінності між різними методами.


2
Велике спасибі.
baj9032

Важлива примітка. Робочий каталог не завжди буде таким самим, як встановлений каталог.
Йорданія


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

З Path.GetDirectoryName

Повертає інформацію про каталог для вказаного рядка шляху.

З Application.ExecutablePath

Отримує шлях до виконуваного файлу, який запустив додаток, включаючи ім'я виконуваного файлу.


19

Використовуй це,

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

Ви також можете використовувати це.

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

9

для використання .NET CORESystem.AppContext.BaseDirectory

(як заміна на AppDomain.CurrentDomain.BaseDirectory)


6

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory

Environment.CurrentDirectoryможна змінити різними способами ... (налаштування знімка та ін.)
Yousha Aleayoub


0

Якщо ви хочете шлях exe, який ви можете використовувати System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);


0

Це найкраще працює для мене, особливо при використанні єдиного файлу dotnet core. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

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