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

OrganicCoder
источник
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;

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

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

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

хад
источник