.NET Process.Start domyślny katalog?


114

Odpalam aplikację Java z wnętrza aplikacji konsoli C # .NET . Działa dobrze w przypadku, gdy aplikacja Java nie dba o katalog „domyślny”, ale kończy się niepowodzeniem w przypadku aplikacji Java, która przeszukuje tylko bieżący katalog w poszukiwaniu plików pomocniczych.

Czy istnieje parametr procesu, który można ustawić, aby określić domyślny katalog, w którym proces jest uruchamiany?

Odpowiedzi:


183

Tak! ProcessStartInfo ma właściwość o nazwie WorkingDirectory , wystarczy użyć:

...
using System.Diagnostics;
...

var startInfo = new ProcessStartInfo();

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

Process proc = Process.Start(startInfo);

Czy może to WorkingDirectorybyć ścieżka względna, a jeśli tak, to jaka jest względna w stosunku do bieżącego pliku lub katalogu bieżącego pliku wykonywalnego? Mam problem ze znalezieniem przez mój program pliku wykonywalnego, który próbuję uruchomić. Ustawiłem katalog roboczy na katalog exe (względem bieżącego pliku i bieżącego exe), ale nie może go znaleźć.
puszkin

56

Użyj właściwości ProcessStartInfo.WorkingDirectory, aby ustawić ją przed rozpoczęciem procesu. Jeśli właściwość nie jest ustawiona, domyślny katalog roboczy to% SYSTEMROOT% \ system32.

Możesz określić wartość% SYSTEMROOT% za pomocą:

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

Oto przykładowy kod, który otwiera Notepad.exe z katalogiem roboczym% 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);

Istnieje również zmienna środowiskowa, która steruje bieżącym katalogiem roboczym dla procesu, do którego można uzyskać dostęp bezpośrednio przez właściwość Environment.CurrentDirectory .


Świetnie, nie wiedziałem, że można używać zmiennych środowiskowych we właściwości .WorkingDirectory.
Brain2000

1
Bingo, to jest odpowiedź - domyślny katalog to SYSTEMROOT. +1
popioły 999

17

Tylko notatka po uderzeniu w głowę, próbując to zrealizować. Ustawienie wartości WorkingDirectory nie działa, jeśli „UseShellExecute” ma wartość false.


1
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienie, zostaw komentarz pod jego postem - zawsze możesz komentować własne posty, a gdy zdobędziesz wystarczającą reputację , będziesz mógł komentować każdy post .
Cyclonecode

1
Nawet 6 lat później ten komentarz dotyczący UseShellExecute był pomocny. Naprawiono problem.
AlanC


6

Metoda Process.Start ma przeciążenie, które przyjmuje wystąpienie ProcessStartInfo. Ta klasa ma właściwość o nazwie „WorkingDirectory”.

Ustaw tę właściwość na folder, którego chcesz użyć, a to powinno spowodować uruchomienie go we właściwym folderze.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.