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



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




  1. Application.StartupPath

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

  3. AppDomain.CurrentDomain.BaseDirectory

  4. System.IO.Directory.GetCurrentDirectory()

  5. Environment.CurrentDirectory

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

  7. System.IO.Path.GetDirectory(Application.ExecutablePath)


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

833   8  

8 ответов:

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

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

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

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

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

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

Application.StartupPath

возвращает

  1. Application.StartupPathи 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath) - будет работать только для приложение Windows Forms

  2. 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" где находится страница, на которой вы работаете.

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

  4. 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 будет каталог, где есть.

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

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

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']
  1. у меня есть ' abc.ехе', который я хочу открыть.
  2. Путь К Файлу : C:\Users\Admin\Documents\Visual Studio 2015\Projects\MyProject\MyProject\abc.exe.

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

  1. в событии щелчка кнопки: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

    Ничего не найдено.