Лучший способ получить путь к папке приложения

363

Я вижу, что есть несколько способов получить путь к папке приложения:

  • Application.StartupPath
  • System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  • AppDomain.CurrentDomain.BaseDirectory
  • System.IO.Directory.GetCurrentDirectory()
  • Environment.CurrentDirectory
  • System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  • System.IO.Path.GetDirectory(Application.ExecutablePath)

Каков наилучший способ в зависимости от ситуации?

  • 7
    Почему у нас есть много способов получить путь к приложению. Я думаю, что есть причина для каждого пути.
  • 0
    В # 6 есть ошибка: следует прочитать: System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase), System.IO.Path.GetDirectoryName (Application.ExecutablePath)
Показать ещё 1 комментарий
Теги:

9 ответов

415
Лучший ответ

AppDomain.CurrentDomain.BaseDirectory, вероятно, наиболее полезен для доступа к файлам, местоположение которых относительно каталога установки приложения.

В приложении ASP.NET это будет корневой каталог приложения, а не подпапка bin - это, вероятно, то, что вы обычно хотите. В клиентском приложении это будет каталог, содержащий основной исполняемый файл.

В приложении VSTO 2005 это будет каталог, содержащий управляемые сборки VSTO для вашего приложения, а не, скажем, путь к исполняемому файлу Excel.

Другие могут возвращать разные каталоги в зависимости от вашей среды - например, см. ответ @Vimvq1987.

CodeBase - это место, где был найден файл, и может быть URL-адресом, начинающимся с http://. В этом случае Location, вероятно, будет кешем загрузки сборки. CodeBase не может быть установлен для сборок в GAC.

  • 1
    При тестировании в Windows XP 32bit возвращается, где был запущен ярлык.
  • 2
    Это также работало на Mac с Xamarin.
Показать ещё 5 комментариев
50

Обратите внимание, что не все из этих методов возвратят одно и то же значение. В некоторых случаях они могут возвращать одинаковое значение, но будьте осторожны, их цели различны:

Application.StartupPath

возвращает параметр StartupPath (может быть установлен при запуске приложения)

System.IO.Directory.GetCurrentDirectory()

возвращает текущий каталог, который может быть или не быть папкой, в которой находится приложение. То же самое касается Environment.CurrentDirectory. Если вы используете это в DLL файле, он вернет путь, где выполняется процесс (это особенно верно в ASP.NET).

  • 5
    Пожалуйста, пожалуйста, пожалуйста, не используйте GetCurrentDirectory() , из-за любви к запуску вещей из разных путей! :(
47
  • Application.StartupPath и 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath) - будет работать только для приложение Windows Forms

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

    Я собираюсь дать вам что-то вроде: "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101", где находится страница, на которой вы работаете.

  • AppDomain.CurrentDomain.BaseDirectory для веб-приложения может быть полезным и вернет что-то вроде "C:\\hg\\Services\\Services\\Services.Website\\", которое является базовым каталогом и весьма полезно.

  • System.IO.Directory.GetCurrentDirectory() и 5. Environment.CurrentDirectory

предоставит вам местоположение, откуда был запущен процесс, поэтому для веб-приложения, работающего в режиме отладки, из Visual Studio что-то вроде "C:\\Program Files (x86)\\IIS Express"

  1. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

получит ваше местоположение, где .dll, на котором запущен код, для веб-приложения, которое может быть "file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

Теперь в случае, например, точки приложения консоли 2-6 будут находиться в каталоге, где находится .exe файл.

Надеюсь, это сэкономит вам некоторое время.

  • 0
    Я уверен, что «текущая папка» актуальна только для не-веб-приложений ...
  • 0
    Это ответ.
6

Для веб-приложения, чтобы получить текущий корневой каталог веб-приложения, обычно вызывайте веб-страницу для текущего входящего запроса:

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Над описанием кода

1

Я начал процесс из Службы Windows по API Win32 в сеансе от пользователя, который фактически вошел в систему (в сеансе 1 диспетчера задач не 0). В этом мы могли бы узнать, какая переменная лучшая.

Для всех 7 случаев из вышеуказанного вопроса следующие результаты:

Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram

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

  • 1
    Очень актуальный ответ. Так много людей забывают, что «рабочий каталог»! = «Программный каталог».
0

По моему опыту, лучший способ - это сочетание этих.

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase предоставит вам папку bin
  2. Directory.GetCurrentDirectory() отлично работает на.Net Core, но не.Net и предоставит вам корневую директорию проекта
  3. System.AppContext.BaseDirectory и AppDomain.CurrentDomain.BaseDirectory работает в.NET, но не в ядре.Net, и предоставит вам корневую директорию проекта

В библиотеке классов, которая должна указывать target.Net и.Net ядро, я проверяю, в какой инфраструктуре находится библиотека, и выберите тот или иной.

0

Как пример:

  • Кнопка: [Name - 'btn_OpenFile']
  • У меня есть "abc.exe", который я хочу открыть.
  • Путь к файлу: C:\Users\Admin\Documents\Visual Studio 2015\Projects\MyProject\MyProject\abc.exe.

Итак, я сделаю следующее:

  • В событии Click Button: btn_OpenFile_Click()

Process.Start(@Environment.CurrentDirectory+"\\..\\..\\abc.exe");

Примечание: "Environment.CurrentDirectory" возвращает этот путь: "C:\\Users\\Admin\\Documents\\Visual Studio 2015\\Projects\\MyProject\\MyProject\\bin\\Debug"

Итак, поместив "\\..", вы можете перейти в более высокий каталог.

  • 0
    Это плохая практика. Структура папок должна быть организована таким образом, чтобы вам не приходилось перемещаться вверх по иерархии вне папки. Лучше получить путь к исполняемой сборке и перейти к нужной подпапке.
0

этот "System.IO.Path.GetDirectory(Application.ExecutablePath)" изменен на System.IO.Path.GetDirectoryName(Application.ExecutablePath)

0

Я успешно использовал этот

System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

Он работает даже внутри linqpad.

  • 0
    в нем отсутствует открывающая скобка GetCurrentProcess. Кстати, он оценивает C: \ Program Files \ dotnet в моем проекте ядра .net при отладке в Visual Studio, потому что именно там находится dotnet.exe
  • 0
    фиксированный. благодарю вас..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню