2009-05-19 93 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