.NET Process.Start Standardverzeichnis?


114

Ich starte eine Java-Anwendung aus einer C # .NET- Konsolenanwendung heraus. Dies funktioniert einwandfrei für den Fall, dass es der Java-Anwendung egal ist, was das "Standard" -Verzeichnis ist, aber für eine Java-Anwendung fehlschlägt, die nur das aktuelle Verzeichnis nach Unterstützungsdateien durchsucht.

Gibt es einen Prozessparameter, der festgelegt werden kann, um das Standardverzeichnis anzugeben, in dem ein Prozess gestartet wird?

Antworten:


183

Ja! ProcessStartInfo Hat eine Eigenschaft namens WorkingDirectory , verwenden Sie einfach:

...
using System.Diagnostics;
...

var startInfo = new ProcessStartInfo();

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

Process proc = Process.Start(startInfo);

Kann WorkingDirectorydies ein relativer Pfad sein, und wenn ja, in welchem ​​Verhältnis zur aktuellen Datei oder zum Verzeichnis der aktuellen ausführbaren Datei? Ich habe Probleme, mein Programm dazu zu bringen, die ausführbare Datei zu finden, die ich starten möchte. Ich habe das Arbeitsverzeichnis auf das Verzeichnis der Exe gesetzt (relativ zur aktuellen Datei und zur aktuellen Exe), aber es kann es nicht finden.
Puschkin

56

Verwenden Sie die ProcessStartInfo.WorkingDirectory- Eigenschaft, um sie vor dem Starten des Prozesses festzulegen . Wenn die Eigenschaft nicht festgelegt ist, lautet das Standardarbeitsverzeichnis% SYSTEMROOT% \ system32.

Sie können den Wert von% SYSTEMROOT% mithilfe von Folgendem bestimmen:

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

Hier ist ein Beispielcode, der Notepad.exe mit einem Arbeitsverzeichnis von% ProgramFiles% öffnet:

...
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);

Es gibt auch eine Umgebungsvariable, die das aktuelle Arbeitsverzeichnis für Ihren Prozess steuert, auf das Sie direkt über die Environment.CurrentDirectory- Eigenschaft zugreifen können .


Schön, ich wusste nicht, dass Sie Umgebungsvariablen in der .WorkingDirectory-Eigenschaft verwenden können.
Brain2000

1
Bingo, das ist die Antwort - das Standardverzeichnis ist SYSTEMROOT. +1
Asche999

17

Nur eine Notiz, nachdem ich meinen Kopf getroffen habe, um dies umzusetzen. Das Festlegen des WorkingDirectory-Werts funktioniert nicht, wenn Sie "UseShellExecute" auf false gesetzt haben.


1
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag. Sie können jederzeit Ihre eigenen Beiträge kommentieren. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren .
Cyclonecode

1
Auch 6 Jahre später war dieser Kommentar zu UseShellExecute hilfreich. Das Problem wurde behoben.
AlanC


6

Die Process.Start-Methode weist eine Überladung auf, die eine Instanz von ProcessStartInfo benötigt. Diese Klasse hat eine Eigenschaft namens "WorkingDirectory".

Legen Sie diese Eigenschaft auf den Ordner fest, den Sie verwenden möchten, damit sie im richtigen Ordner gestartet wird.


4

Verwenden Sie die ProcessStartInfoKlasse und weisen Sie der WorkingDirectoryEigenschaft einen Wert zu .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.