Чи слід використовувати AppDomain.CurrentDomain.BaseDirectory або System.Environment.CurrentDirectory?


86

У мене є два файли exe в одній папці, я можу запустити exe2 за допомогою кнопки у файлі exe1. Сьогодні я спостерігав за клієнтом за віддаленим сеансом (послуги терміналу), і exe2 не вдалося запустити помилку "Файл не знайдено", але exe1 знаходився в тому ж каталозі, коли ми перевіряли. Тож чи повинен я використовувати AppDomain.CurrentDomain.BaseDirectory або System.Environment.CurrentDirectory ?

Дякую


@Jade M Як ти виконуєш свій exe1 на терміналі?
пані Соня

Я хочу додати свої два центи, сказавши, що string.GetFullPath(path)використовує, Environment.CurrentDirectoryа не CurrentDomain.BaseDirectory, на мій подив.
JBSnorro

Відповіді:


185

Якщо ви хочете знайти файли в тому ж каталозі, що і ваша програма, AppDomain.CurrentDomain.BaseDirectoryце правильний вибір.

Environment.CurrentDirectory- це значення, яке може і зміниться в ході запуску вашої програми. Наприклад, використовуючи параметри за замовчуванням, OpenFileDialog у WinForms змінить це значення на каталог, з якого було вибрано файл.


Я використав button1, щоб показати OpenFileDialog, потім button2, щоб показати Environment.CurrentDirectory, але все одно показати папку налагодження, чому?
Лей Ян

18

AppDomain.CurrentDomain.BaseDirectoryповертає каталог, звідки був завантажений поточний домен програми.
System.Environment.CurrentDirectoryповертає поточний системний каталог.
У вашому випадку AppDomain.CurrentDomain.BaseDirectoryце найкраще рішення.


1
Щоб бути зрозумілим, System.Environment.CurrentDirectory повертає поточний (специфічний для процесу) робочий каталог.
Оскар Берггрен,

14

Ви повинні використовувати AppDomain.CurrentDomain.BaseDirectory.

Наприклад, у програмі служб Windows:

System.Environment.CurrentDirectoryповерне C: \ Windows \ system32

Поки

AppDomain.CurrentDomain.BaseDirectory поверне [Application.exe розташування]

Ще одним важливим фактором, на який слід звернути увагу, AppDomain.CurrentDomain.BaseDirectoryє властивість лише для читання, тоді як при необхідності це Environment.CurrentDirectoryможе бути щось інше:

// Change the directory to AppDomain.CurrentDomain.BaseDirectory
Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;   

6

Як я розумію, вам слід використовувати BaseDirectory. CurrentDirectoryможе змінитися протягом виконання програми.


3

У тестових проектах Visual Studio 2010, якщо ви ввімкнете параметр розгортання Змінити налаштування тесту, AppDomain.CurrentDomain.BaseDirectory вказує на папку TestResults \ Out (не bin \ debug). Хоча, точка встановлення за замовчуванням для папки bin \ debug.

Тут я знайшов переконливу відповідь.

Чому AppDomain.CurrentDomain.BaseDirectory не містить "bin" у програмі asp.net?


2

Зазвичай я використовую щось на зразок:

            string AppPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            AppPath = AppPath.Replace("file:\\", "");

2

Я також пережив кілька днів тому, коли використовував

Environment.CurrentDirectory

оскільки це видавало мені проблеми на робочому сервері, але добре працювало з моїм локальним сервером,

Отже, я спробував

System.AppDomain.CurrentDomain.BaseDirectory;

І це спрацювало для мене в обох середовищах.

Отже, як усі вони казали, нам слід завжди йти

System.AppDomain.CurrentDomain.BaseDirectory;

оскільки він перевіряє каталог поточного домену на шлях.

шукайте додаткову інформацію

Не вдалося знайти частину помилки шляху на сервері

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