Лучший способ получить путь к папке приложения
Я вижу, что есть несколько способов получить путь к папке приложения:
Application.StartupPathSystem.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location)AppDomain.CurrentDomain.BaseDirectorySystem.IO.Directory.GetCurrentDirectory()Environment.CurrentDirectorySystem.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)System.IO.Path.GetDirectory(Application.ExecutablePath)
каков наилучший способ в зависимости от ситуации?
8 ответов:
AppDomain.CurrentDomain.BaseDirectoryвероятно, наиболее полезно для доступа к файлам, расположение которых относительно каталога установки приложения.В АН ASP.NET приложение, это будет корневой каталог приложения, а не подпапка bin - что, вероятно, то, что вы обычно хотите. В клиентском приложении это будет каталог, содержащий основной исполняемый файл.
в приложении VSTO 2005 это будет каталог, содержащий управляемые сборки VSTO для вашего приложения, нет, скажем, путь к исполняемому файлу Excel.
другие могут возвращать разные каталоги в зависимости от вашей среды - например, см. ответ @Vimvq1987.
CodeBaseэто место, где был найден файл и может быть URL, начинающийся с http://. В таком случаеLocationвероятно, будет кэш загрузки сборки. Не гарантируется, что кодовая база будет установлена для сборок в GAC.
обратите внимание, что не все эти методы будут возвращать одинаковое значение. В некоторых случаях они могут возвращать одно и то же значение, но будьте осторожны, их цели различны:
Application.StartupPathвозвращает
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 будет каталог, где есть.
надеюсь, что это экономит ваше время.
для веб-приложения, чтобы получить текущий корневой каталог веб-приложения, как правило, на веб-страницу для текущего входящего запроса:
HttpContext.Current.Server.MapPath(); System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
Я запустил процесс из службы Windows через Win32 API в сеансе от пользователя, который фактически вошел в систему (в сеансе Диспетчера задач 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возможно, это полезно для некоторых из вас, делая то же самое, когда вы ищете лучшую переменную для вашего случая.
этот "System.IO.Path.GetDirectory(Application. ExecutablePath)" изменен на System.IO.Path.GetDirectoryName(Application. ExecutablePath)
Например :
: [Имя - '
btn_OpenFile']- у меня есть ' abc.ехе', который я хочу открыть.
- Путь К Файлу :
C:\Users\Admin\Documents\Visual Studio 2015\Projects\MyProject\MyProject\abc.exe.Итак, я сделаю следующее :
- в событии щелчка кнопки:
btn_OpenFile_Click()
Process.Start(@Environment.CurrentDirectory+"\..\..\abc.exe");Примечание : "Окружающая Среда.CurrentDirectory " возвращает этот путь:
"C:\Users\Admin\Documents\Visual Studio 2015\Projects\MyProject\MyProject\bin\Debug"Итак, Поставив
"\.."это, вы можете пойти выше справочник.
я использовал этот успешно
System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)Он работает даже внутри linqpad.
Comments