2012-06-12 1 views
41

Я пытался получить каталог консольного приложения, используя код, приведенный ниже,Как получить каталог выполнения консольного приложения

Assembly.GetExecutingAssembly().Location 

, но это одна дает мне, где собираться проживает. Это может отличаться от того, где я выполнил приложение.

Моя консольная программа анализирует журналы без параметров. Он должен перейти в папку logs/ внутри папки исполняемого файла, или если я дам ей путь к logs/, он анализирует его.

+0

Взгляните на этот вопрос: http://stackoverflow.com/questions/ 674857/should-i-use-appdomain-currentdomain-basedirectory-or-system-environment-current – Karsten

ответ

69

Environment.CurrentDirectory.

Получает или задает полный путь к текущему рабочему каталогу.
(MSDN Environment.CurrentDirectory Property)

string logsDirectory = Path.Combine(Environment.CurrentDirectory, "logs"); 

Если ваше приложение работает в C: \ Foo \ BarlogsDirectory укажут C: \ Foo \ Bar \ журналы.

+15

Текущий каталог отличается от директивы содержащий текущий исполняемый файл. – KFL

+0

Environment.CurrentDirectory - это значение, которое может и будет изменяться в ходе запуска вашего приложения. Например, используя параметры по умолчанию, OpenFileDialog в WinForms изменит это значение на каталог, в котором был выбран файл из –

6

Safest путь:

string temp = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); 
+3

. CodeBase - это URL-адрес места, где был найден файл, а Location - это путь от того места, где он был на самом деле загружен. Например, если сборка была загружена из Интернета, ее CodeBase может начинаться с «http: //», но ее местоположение может начинаться с «C: \». Если файл был скопирован теневым шрифтом, то Location будет путь к копии файла в директории shadow-copy. Также хорошо знать, что CodeBase не может быть установлен для сборок в GAC. Однако расположение всегда будет установлено для сборок, загруженных с диска. –

+0

Убедившись, что файл находится на диске, я использую эту версию для получения «обычного» пути вместо 'file: //' path: 'Path.GetDirectoryName (новый Uri (this.GetType()). Assembly.GetName() .CodeBase) .LocalPath) ' – Timo

16

Используйте это:

System.Reflection.Assembly.GetExecutingAssembly().Location 

Комбинат, что с

System.IO.Path.GetDirectoryName if all you want is the directory. 
+2

[Источник] (http://stackoverflow.com/a/837501/397322) – William

+0

Если я использую Environment.CurrentDirectory, который запускается под Запланированной задачей, он перейдет к C: \ Windows \ system32 \ log, который не является ходом выполнения. Затем я использую это System.Reflection.Assembly.GetExecutingAssembly(). Location, он указывает на мой правильный путь выполнения exe. Благодаря! – LifeiSHot

+0

Возможно, это не сработает, поскольку вы надеетесь на модульные тесты или веб-проекты, на которых запущен локальный IIS. Ответ 'CodeBase'. – Timo