Лучший способ получить путь к папке приложения
Я вижу, что есть несколько способов получить путь к папке приложения:
-
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)
Каков наилучший способ в зависимости от ситуации?
Ответы
Ответ 1
AppDomain.CurrentDomain.BaseDirectory
, вероятно, наиболее полезен для доступа к файлам, местоположение которых относительно каталога установки приложения.
В приложении ASP.NET это будет корневой каталог приложения, а не подпапка bin - это, вероятно, то, что вы обычно хотите. В клиентском приложении это будет каталог, содержащий основной исполняемый файл.
В приложении VSTO 2005 это будет каталог, содержащий управляемые сборки VSTO для вашего приложения, а не, скажем, путь к исполняемому файлу Excel.
Другие могут возвращать разные каталоги в зависимости от вашей среды - например, см. ответ @Vimvq1987.
CodeBase
- это место, где был найден файл, и может быть URL-адресом, начинающимся с http://. В этом случае Location
, вероятно, будет кешем загрузки сборки. CodeBase не может быть установлен для сборок в GAC.
Ответ 2
Обратите внимание, что не все из этих методов возвратят одно и то же значение. В некоторых случаях они могут возвращать одинаковое значение, но будьте осторожны, их цели различны:
Application.StartupPath
возвращает параметр StartupPath
(может быть установлен при запуске приложения)
System.IO.Directory.GetCurrentDirectory()
возвращает текущий каталог, который может быть или не быть папкой, в которой находится приложение. То же самое касается Environment.CurrentDirectory
. Если вы используете это в DLL файле, он вернет путь, где выполняется процесс (это особенно верно в ASP.NET).
Ответ 3
-
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"
-
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
получит ваше местоположение, где .dll
, на котором запущен код, для веб-приложения, которое может быть "file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"
Теперь в случае, например, точки приложения консоли 2-6 будут находиться в каталоге, где находится .exe
файл.
Надеюсь, это сэкономит вам некоторое время.
Ответ 4
Для веб-приложения, чтобы получить текущий корневой каталог веб-приложения, обычно вызывайте веб-страницу для текущего входящего запроса:
HttpContext.Current.Server.MapPath();
System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
Над описанием кода
Ответ 5
Я начал процесс из Службы 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
Возможно, это полезно для некоторых из вас, делая то же самое, когда вы ищете лучшую переменную для своего случая.
Ответ 6
Я успешно использовал этот
System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
Он работает даже внутри linqpad.
Ответ 7
этот "System.IO.Path.GetDirectory(Application.ExecutablePath)" изменен на
System.IO.Path.GetDirectoryName(Application.ExecutablePath)
Ответ 8
Как пример:
- Кнопка: [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"
Итак, поместив "\\.."
, вы можете перейти в более высокий каталог.
Ответ 9
По моему опыту, лучший способ - это сочетание этих.
-
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
предоставит вам папку bin -
Directory.GetCurrentDirectory()
отлично работает на.Net Core, но не.Net и предоставит вам корневую директорию проекта -
System.AppContext.BaseDirectory
и AppDomain.CurrentDomain.BaseDirectory
работает в.NET, но не в ядре.Net, и предоставит вам корневую директорию проекта
В библиотеке классов, которая должна указывать target.Net и.Net ядро, я проверяю, в какой инфраструктуре находится библиотека, и выберите тот или иной.