2009-05-19 24 views
56

Tôi đã tạo một Dịch vụ .NET Windows rất đơn giản và cài đặt nó bằng tiện ích InstallUtil.exe.Dịch vụ Windows chạy trong thư mục nào?

Trong dịch vụ tôi có một đoạn mã như vậy:

if (File.Exists("test_file.txt")) 
{ 
    // Do something clever 
} 

tôi đã tạo ra một tập tin gọi test_file.txt trong cùng thư mục với các dịch vụ nhưng phần nhận xét của mã không bao giờ là Thực thi...?

+0

Liệu người dùng có thể chạy các dịch vụ có quyền đúng vào file? – CSharpAtl

Trả lời

51

Dịch vụ được bắt đầu từ một ứng dụng có tên Service Control Manager. Ứng dụng này sống trong các thư mục hệ thống % WinDir% \ System32

Trên Windows 7 Ultimate - 64 bit con đường này thực sự là: % WinDir% \ SysWOW64

Để biết thêm thông tin, xem Service Control Manager at MSDN.

Cảm ơn Harper Shelby đã chỉ ra vấn đề với bài đăng gốc.

+1

svchost.exe là một máy chủ dịch vụ cho hầu hết các dịch vụ windows nội bộ. Các dịch vụ có thể và trong trường hợp các dịch vụ không phải Windows có nhiều khả năng thực hiện, hãy chạy trong một máy chủ exe khác. – Michael

+2

Thư mục đúng, lý do sai. –

+1

Cảm ơn - thả tập tin vào đó làm cho nó hoạt động để tôi có thể xác nhận vị trí đó: c: \ windows \ system32 – Guy

78
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory()); 

sẽ xuất thư mục hiện tại. Đặt mã đó vào phương thức khởi động dịch vụ của bạn và sử dụng công cụ như DebugView để kiểm tra kết quả. Sau đó, bạn sẽ biết thư mục khởi động dịch vụ của bạn.

Kỹ thuật đơn giản này sẽ hữu ích với nhiều vấn đề trong phát triển dịch vụ, đặc biệt là để gỡ lỗi khởi động dịch vụ.

Có thể bạn đã dự kiến ​​thư mục làm việc của dịch vụ là thư mục nơi dịch vụ thực thi đang ở (tôi cũng vậy). Bạn có thể thay đổi đến thư mục đó bằng cách sử dụng dòng mã sau đây:

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 
+1

Đó là một mẹo hay - cảm ơn! – Guy

+1

+! cho giải pháp tốt cho vấn đề. –

11

Bạn có thể làm cho nó hoạt động như vậy:

string cwd = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]); 
Directory.SetCurrentDirectory(cwd ?? "."); 
+1

+1, điều này cho phép phần còn lại của ứng dụng hoạt động như thể nó là một .exe thông thường nơi thư mục hiện tại là đường dẫn của nó. Cảm ơn, đây chính xác là những gì tôi cần! Tránh phải viết lại mã sử dụng đường dẫn tương đối. – Paul

2

cũng Muốn biết trong đó thư mục một dịch vụ Windows đang chạy nhưng mã nguồn không phải của tôi nên không thể sửa đổi nó. Nhập vào Dấu nhắc Lệnh sc qc <service name> hiển thị thư mục trong BINARY_PATH_NAME.

C:\>sc qc 
DESCRIPTION: 
     Queries the configuration information for a service. 
USAGE: 
     sc <server> qc [service name] <bufferSize> 

khi MyService truy vấn get:

C:> sc qc MyService

[SC] QueryServiceConfig SUCCESS 

SERVICE_NAME: MyService 
     TYPE    : 10 WIN32_OWN_PROCESS 
     START_TYPE   : 3 DEMAND_START 
     ERROR_CONTROL  : 1 NORMAL 
     BINARY_PATH_NAME : "D:\Routines\MyService\MyService.exe" 
     LOAD_ORDER_GROUP : 
     TAG    : 0 
     DISPLAY_NAME  : MyService 
     DEPENDENCIES  : 
     SERVICE_START_NAME : LocalSystem 
+0

Đó là đường dẫn nơi dịch vụ nhị phân được đặt, không được đảm bảo bằng với thư mục "hiện đang hoạt động" của dịch vụ có thể thay đổi nhiều lần trong suốt thời gian hoạt động của quy trình (dịch vụ). Các tên tập tin tương đối (như trong ví dụ OPs) được giải quyết dựa vào thư mục làm việc hiện tại, không phải thư mục chứa vị trí nhị phân thực thi. –

+0

'sc qc apache2.4' hiển thị' ... BINARY_PATH_NAME: "E: \ root \ Public Cache \ Apache Httpd \ httpd-2.4.20-x86-vc11 \ Apache24 \ bin \ httpd.exe" -k runervice', nhưng thư mục làm việc thay vào đó là '% WinDir% \ System32' – Pacerier

Các vấn đề liên quan