Лучший способ получить путь к папке приложения - PullRequest
435 голосов
/ 18 мая 2011

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

  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)

Как лучше всего в зависимости от ситуации?

Ответы [ 10 ]

454 голосов
/ 18 мая 2011

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

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

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

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

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

70 голосов
/ 09 февраля 2016
  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"

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

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

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

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

59 голосов
/ 18 мая 2011

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

Application.StartupPath

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

System.IO.Directory.GetCurrentDirectory()

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

8 голосов
/ 06 июня 2015

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

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Описание кода выше

2 голосов
/ 17 марта 2017

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

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

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

1 голос
/ 06 декабря 2018

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

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

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

1 голос
/ 10 февраля 2017

Я запустил процесс из службы 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

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

0 голосов
/ 04 января 2019

Корневой каталог:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;
0 голосов
/ 04 января 2019

Если вы знаете, чтобы получить корневой каталог:

string rootPath = Path.GetPathRoot(Application.StartupPath)
0 голосов
/ 08 апреля 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...