Чи слід використовувати 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.