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

222

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

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

Любые идеи?

user2214609
источник

Ответы:

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

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

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

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

kmote
источник
2
Большое спасибо.
baj9032
Важное замечание Рабочий каталог не всегда будет таким же, как установленный каталог.
Иордания
24

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

System.Environment.CurrentDirectory

Хоссейн Наримани Рад
источник
1
Environment.CurrentDirectoryможно изменить несколькими способами ... (настройки shotrtcut и т. д.)
Yousha Aleayoub
21
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

Из Path.GetDirectoryName

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

Из Application.ExecutablePath

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

Soner Gönül
источник
19

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

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

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

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
fhnaseer
источник
9

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

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

Йонатан
источник
6

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

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

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

Говард Ротенбург
источник
0

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

Кейша W
источник