我创建了一个非常简单的.NET Windows服务,并使用InstallUtil.exe实用程序进行了安装。
在服务中,我有一段这样的代码:
if (File.Exists("test_file.txt"))
{
// Do something clever
}
我已经在与服务相同的目录中创建了一个名为test_file.txt的文件,但是代码的注释部分从未执行过...?
Answers:
服务从称为服务控制管理器的应用程序启动。此应用程序位于系统目录%WinDir%\ System32中
在Windows 7 Ultimate-64位上,该路径实际上是:%WinDir%\ SysWOW64
有关更多信息,请参见MSDN上的Service Control Manager。
感谢Harper Shelby指出原始帖子的问题。
%WinDir%\SysWOW64
代替
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory());
将输出当前目录。将代码放入服务的启动方法中,然后使用DebugView之类的工具检查输出。然后,您将知道服务的启动文件夹。
这种简单的技术将对服务开发中的许多问题很有用,尤其是调试服务启动时。
您可能希望服务的工作文件夹是服务可执行文件所在的文件夹(我也是)。您可以使用以下代码行转到该文件夹:
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
还想知道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
sc qc apache2.4
显示...BINARY_PATH_NAME : "E:\root\Public Cache\Apache Httpd\httpd-2.4.20-x86-vc11\Apache24\bin\httpd.exe" -k runservice
,但工作目录改为%WinDir%\System32