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


222

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

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

Любые идеи?

Ответы:


334

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

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

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

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

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

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

10
GetEntryAssembly () и GetExecutingAssembly () имеют интересную разницу. Для получения дополнительной информации см. Stackoverflow.com/a/18562036/30289
Бхадра

3
Как я уже сказал: это возвращает путь, где находится текущая сборка . Разница между GetEntryAssemblyи GetExecutingAssemblyне вызывает особого удивления, также очевидна по названию функции. Если они сделали то же самое, почему должно быть две функции? :-)
Торстен Диттмар

2
+1 Assembly.GetEntryAssembly () помог мне в случае запущенного приложения с помощью ClickOnce
ARTIOM

9
Это в System.Reflection, так System.Reflection.Assembly.GetExecutingAssembly().Locationчто это полное - если вы тестируете из Immediate Window
Red Pea

147
System.AppDomain.CurrentDomain.BaseDirectory

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


9
Это наиболее точное свойство для этой цели. BaseDirectory объекта CurrentDomain всегда будет указывать на правильное местоположение, даже если домен AppDomain создается динамически для просмотра сборок из другого места.
Дхрувин

Отлично. Это работает независимо для любого приложения, особенно при использовании Streamreader, который может читать различные абсолютные пути в зависимости от типа приложения.
user3326078

40

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

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

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

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

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

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


2
Большое спасибо.
baj9032

Важное замечание Рабочий каталог не всегда будет таким же, как установленный каталог.
Иордания


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

Из Path.GetDirectoryName

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

Из Application.ExecutablePath

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


19

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

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

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

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

9

для использования .NET CORESystem.AppContext.BaseDirectory

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


6

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory

Environment.CurrentDirectoryможно изменить несколькими способами ... (настройки shotrtcut и т. д.)
Yousha Aleayoub



0

Это работает лучше всего для меня, особенно при использовании публикации файлов в ядре dotnet. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName),

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