2009-05-19 56 views
56

我創建了一個非常簡單的.NET Windows服務,並使用InstallUtil.exe實用程序安裝它。Windows服務運行在什麼目錄?

在服務我有一段代碼,例如:

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

我創建了一個名爲test_file.txt在相同的目錄服務,但代碼的註釋部分文件永不執行...?

+0

這是否運行服務對文件正確的權限的用戶? – CSharpAtl 2009-05-19 21:07:03

回答

51

服務從名爲Service Control Manager的應用程序啓動。此應用程序住在系統目錄%WINDIR%\ SYSTEM32

在Windows 7旗艦版 - 64位,這條路居然是:%WINDIR%\ Syswow64資料

欲瞭解更多信息,請參閱Service Control Manager at MSDN

感謝Harper Shelby指出原始帖子的問題。

+1

svchost.exe是大多數內部Windows服務的服務主機。服務可以,而且在非Windows服務的情況下,可以運行在不同的exe主機上。 – Michael 2009-05-19 21:02:11

+2

正確的目錄,錯誤的原因。 – 2009-05-19 21:21:29

+1

謝謝 - 刪除文件在那裏使它的工作,所以我可以確認位置:C:\ WINDOWS \ SYSTEM32 – Guy 2009-05-19 21:22:37

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

將輸出當前目錄。將該代碼放入服務的啓動方法中,並使用DebugView之類的工具檢查輸出。然後你會知道你的服務的啓動文件夾。

這個簡單的技術對於服務開發中的許多問題很有用,特別是調試服務啓動。

您可能預計服務的工作文件夾將成爲服務可執行文件所在的文件夾(我也是如此)。您可以使用下面的代碼行更改到該文件夾​​:

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 
11

你可以把它像這樣工作:

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

誠徵也知道在哪個文件夾中的Windows服務中運行,但源代碼不是我的,所以不能修改它。在命令提示符sc qc <service name>中鍵入將顯示BINARY_PATH_NAME中的文件夾。

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

查詢時爲MyService得到:

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