В чем разница между этими способами получения текущего каталога?

Все они дают одинаковый результат - расположение папки, в которой выполняется exe, который выполняется. Я уверен, что нет хороших или плохих методов в .net BCL. Все они подходят в особых обстоятельствах. Какой из них подходит для какого сценария?

var appBaseDir = AppDomain.CurrentDomain.BaseDirectory; 
var currentDir = Environment.CurrentDirectory; 
var dir = Directory.GetCurrentDirectory(); 
var path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

Ответы

Ответ 1

Все они дают одинаковый результат

Конечно, нет. currentDir и dir оба дают вам текущий рабочий каталог, то есть по умолчанию каталог, из которого был запущен ваш исполняемый файл (но его можно изменить во время выполнения).

В отличие от этого, appBaseDir и path получают каталог, содержащий файл исполняемых сборок.

Чтобы проиллюстрировать, как они отличаются, учтите, что у вас есть исполняемый файл, который находится в C:\bar\baz.exe. Теперь я могу выполнить приложение, введя следующую цепочку команд в терминале:

$ md C:\foo
$ cd C:\foo
$ ..\bar\baz.exe

Теперь текущий рабочий каталог C:\foo, но базовый каталог приложений C:\bar. Существуют аналогичные способы установки рабочего каталога для других способов запуска приложения (например, с помощью значка ярлыка или программно, например, через Process.Start).

Тем не менее, структура предоставляет различные способы доступа к этой информации:

Environment.CurrentDirectory довольно точно передает значение, которое запрашивает среда выполнения (переменная среды). Directory.GetCurrentDirectory() может фактически сделать то же самое внутри (я не знаю), но он инкапсулирует это и скорее фокусируется на предоставлении пользователю логического API для запроса информации о каталогах.

AppDomain.CurrentDomain содержит информацию о текущем AppDomain (грубо говоря, исполняемом файле). Часть этой информации логически относится к пути AppDomain. Напротив, System.Reflection.Assembly дает вам общую информацию о сборках - они представляют собой любые двоичные объекты в .NET, включая библиотеки DLL и EXE. GetExecutingAssembly в частности возвращает текущую выполненную сборку. И вы можете получить свой путь снова, запросив его свойство Location, которое дает физический путь файла сборки.

Ответ 2

enter image description here

Рассмотрим приведенный выше пример Файл myTest.exe содержит точку входа и находится в D:\myTest.exe. Этот exe вызывает через отражение метод в сборке в F:\. Эта сборка содержит весь код каталога поиска.

В командной строке у меня установлен мой текущий каталог C:\

Вот результаты

AppDomain.CurrentDomain.BaseDirectory

D:\

Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly(). Location)

F:\

Environment.CurrentDirectory и Directory.GetCurrentDirectory()

C:\

Ответ 3

AppDomain.CurrentDomain.BaseDirectory предоставит вам каталог, в котором запущено приложение.

Environment.CurrentDirectory и Directory.GetCurrentDirectory могут меняться во время выполнения приложения. Вы можете увидеть поведение, если вы получите значение в начале выполнения, затем используйте что-то вроде OpenFileDialog, а затем снова получите значение. Вы заметите, что значение изменится на то место, где указывает OpenFileDialog.