.NET Process.Start thư mục mặc định?


114

Tôi đang kích hoạt ứng dụng Java từ bên trong ứng dụng bảng điều khiển C # .NET . Nó hoạt động tốt cho trường hợp ứng dụng Java không quan tâm thư mục "mặc định" là gì, nhưng không thành công đối với ứng dụng Java chỉ tìm kiếm thư mục hiện tại để tìm tệp hỗ trợ.

Có tham số quy trình nào có thể được đặt để chỉ định thư mục mặc định mà tiến trình được bắt đầu không?

Câu trả lời:


183

Đúng! ProcessStartInfo Có thuộc tính là WorkingDirectory , chỉ cần sử dụng:

...
using System.Diagnostics;
...

var startInfo = new ProcessStartInfo();

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

Process proc = Process.Start(startInfo);

Có thể WorkingDirectorylà một đường dẫn tương đối, và nếu có, thì nó có liên quan gì đến, tệp hiện tại hoặc thư mục của tệp thực thi hiện tại không? Tôi đang gặp sự cố khi đưa chương trình của mình tìm tệp thực thi mà tôi đang cố khởi động. Tôi đã đặt thư mục làm việc thành thư mục của exe (liên quan đến tệp hiện tại và với exe hiện tại), nhưng nó không thể tìm thấy.
pushkin

56

Sử dụng thuộc tính ProcessStartInfo.WorkingDirectory để đặt nó trước khi bắt đầu quá trình. Nếu thuộc tính không được đặt, thư mục làm việc mặc định là% SYSTEMROOT% \ system32.

Bạn có thể xác định giá trị của% SYSTEMROOT% bằng cách sử dụng:

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

Dưới đây là một số mã mẫu để mở Notepad.exe với thư mục làm việc của% 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);

Ngoài ra còn có một biến Môi trường kiểm soát thư mục làm việc hiện tại cho quy trình của bạn mà bạn có thể truy cập trực tiếp thông qua thuộc tính Environment.CurrentDirectory .


Thật tuyệt, tôi không biết bạn có thể sử dụng các biến môi trường trong thuộc tính .WorkingDirectory.
Brain2000,

1
Bingo, đó là câu trả lời - thư mục mặc định là SYSTEMROOT. +1
tro999

17

Chỉ cần một lưu ý sau khi đánh đầu tôi cố gắng thực hiện điều này. Đặt giá trị WorkingDirectory không hoạt động nếu bạn đã đặt "UseShellExecute" thành false.


1
Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, hãy để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của chính mình và khi bạn có đủ uy tín, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào .
Cyclonecode

1
Thậm chí 6 năm sau, nhận xét này về UseShellExecute rất hữu ích. Đã khắc phục sự cố.
AlanC


6

Phương thức Process.Start có một quá tải lấy một phiên bản của ProcessStartInfo. Lớp này có một thuộc tính là "WorkingDirectory".

Đặt thuộc tính đó vào thư mục bạn muốn sử dụng và điều đó sẽ làm cho nó khởi động trong đúng thư mục.


4

Sử dụng ProcessStartInfolớp và gán một giá trị cho thuộc WorkingDirectorytính.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.