it-swarm.com.ru

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

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

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

Есть идеи?

171
user2214609

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

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

В то время как мой предложенный подход позволяет вам различать исполняющую сборку, входную сборку или любую другую загруженную сборку, как Soner Gönül сказал в своем ответе, 

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

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

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
271
Thorsten Dittmar
System.AppDomain.CurrentDomain.BaseDirectory

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

101
hakan

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

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

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

ОБНОВЛЕНИЕ: Я изменил свойства ярлыка, изменив поле «Start In:» на C:\temp3. Это привело к следующему выводу:

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

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

26
kmote

Попробуй это:

System.Environment.CurrentDirectory

23
Hossein Narimani Rad
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

С Path.GetDirectoryName

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

С Application.ExecutablePath

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

20
Soner Gönül

Использовать этот,

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

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

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

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory
6
Tomtom

для .NET CORE использовать System.AppContext.BaseDirectory

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

3
yonatan

Используйте Application.StartupPath для лучшего результата imo. 

0
farosch

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

0
Howard Rothenburg