Получить текущий путь к папке

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

Я пробовал System.Windows.Forms.Application.StartupPath, но это кажется неправильным.

Любые идеи?

Ответ 1

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

Лучше использовать Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); для вашей цели. Это возвращает имя пути, в котором находится текущая исполняемая сборка.

В то время как мой предложенный подход позволяет вам различать исполняющую сборку, сборку ввода или любую другую загруженную сборку, как сказал в своем ответе Сонер Гюнль,

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

также может быть достаточным. Это будет равно

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

Ответ 2

System.AppDomain.CurrentDomain.BaseDirectory

Это даст вам текущую директорию вашего приложения. Это даже работает для веб-приложений. Впоследствии вы можете связаться с вашим файлом.

Ответ 3

Я создал простое консольное приложение со следующим кодом:

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);

Я скопировал полученный исполняемый файл в C:\temp2. Затем я разместил ярлык для этого исполняемого файла в C:\temp3 и запустил его (один раз из самого exe и один раз из ярлыка). Он выдавал следующие результаты одновременно:

C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2

Хотя я уверен, что для того, чтобы объяснить, почему существуют пять разных методов, которые должны делать практически то же самое, должно быть какое-то сообразительное соображение, я, конечно, не знаю, что это такое. Тем не менее, казалось бы, что в большинстве случаев вы можете сами выбирать то, что вам нравится.

UPDATE: Я изменил свойства ярлыка, изменив поле "Начать в:" на C:\temp3. Это привело к следующему выводу:

C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3

..., который демонстрирует, по крайней мере, некоторые различия между различными методами.

Ответ 5

string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

От Path.GetDirectoryName

Возвращает информацию каталога для указанной строки пути.

От Application.ExecutablePath

Возвращает путь к исполняемому файлу, который запускал приложение, включая имя исполняемого файла.

Ответ 6

Используйте это,

var currentDirectory = System.IO.Directory.GetCurrentDirectory(); 

Вы также можете использовать это.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

Ответ 7

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory

Ответ 8

для .NET CORE используйте System.AppContext.BaseDirectory

(в качестве замены для AppDomain.CurrentDomain.BaseDirectory)

Ответ 10

Если вы хотите путь exe, вы можете использовать System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly(). Location);