Должен ли я использовать 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;

И это сработало для меня как в Environment.

Итак, как все они сказали, мы всегда должны идти с

System.AppDomain.CurrentDomain.BaseDirectory;

поскольку он проверяет каталог текущего домена на предмет пути.

ищите дополнительную информацию

Не удалось найти часть ошибки пути на сервере

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.