.NET Process.Start каталог по умолчанию?


114

Я запускаю приложение Java из консольного приложения C # .NET . Он отлично работает в случае, когда приложение Java не заботится о том, какой каталог "по умолчанию", но терпит неудачу для приложения Java, которое только ищет в текущем каталоге файлы поддержки.

Есть ли параметр процесса, который можно установить, чтобы указать каталог по умолчанию, в котором запускается процесс?

Ответы:


183

Да! ProcessStartInfo Имеет свойство WorkingDirectory , просто используйте:

...
using System.Diagnostics;
...

var startInfo = new ProcessStartInfo();

  startInfo.WorkingDirectory = // working directory
  // set additional properties 

Process proc = Process.Start(startInfo);

Может ли это WorkingDirectoryбыть относительный путь, и если да, то что он относительно текущего файла или каталога текущего исполняемого файла? Мне не удается заставить мою программу найти исполняемый файл, который я пытаюсь запустить. Я установил рабочий каталог в каталог exe (относительно текущего файла и текущего exe), но он не может его найти.
— Пушкин

56

Используйте свойство ProcessStartInfo.WorkingDirectory, чтобы установить его перед запуском процесса. Если свойство не установлено, рабочий каталог по умолчанию -% SYSTEMROOT% \ system32.

Вы можете определить значение% SYSTEMROOT%, используя:

string _systemRoot = Environment.GetEnvironmentVariable("SYSTEMROOT");  

Вот пример кода, который открывает Notepad.exe с рабочим каталогом% ProgramFiles%:

...
using System.Diagnostics;
...

ProcessStartInfo _processStartInfo = new ProcessStartInfo();
  _processStartInfo.WorkingDirectory = @"%ProgramFiles%";
  _processStartInfo.FileName         = @"Notepad.exe";
  _processStartInfo.Arguments        = "test.txt";
  _processStartInfo.CreateNoWindow   = true;
Process myProcess = Process.Start(_processStartInfo);

Также существует переменная Environment, которая контролирует текущий рабочий каталог для вашего процесса, к которому вы можете получить доступ напрямую через свойство Environment.CurrentDirectory .


Хорошо, я не знал, что вы можете использовать переменные среды в свойстве .WorkingDirectory.
— Brain2000,

1
Бинго, вот и ответ - каталог по умолчанию - SYSTEMROOT. +1
— ashes999

17

Просто записка после удара головой, пытаясь реализовать это. Установка значения WorkingDirectory не работает, если для параметра UseShellExecute установлено значение false.


1
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением - вы всегда можете комментировать свои собственные сообщения, и как только у вас будет достаточная репутация, вы сможете комментировать любое сообщение .
— Cyclonecode

1
Даже 6 лет спустя этот комментарий об UseShellExecute оказался полезным. Исправлена ​​проблема.
— AlanC


6

Метод Process.Start имеет перегрузку, которая принимает экземпляр ProcessStartInfo. Этот класс имеет свойство под названием «WorkingDirectory».

Установите это свойство в папку, которую вы хотите использовать, и это должно заставить его запускаться в правильной папке.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.