Windows 服务在哪个目录下运行?

我创建了一个非常简单的.NET Windows Service,并使用 InstallUtil.exe 实用工具安装了它。

在服务中,我有一段这样的代码:

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

我已经在与服务相同的目录中创建了一个名为 test _ file.txt 的文件,但是代码的注释部分从未被执行过... ?

74328 次浏览

Services are started from an application called Service Control Manager. This application lives in the system directory %WinDir%\System32

On a Windows 7 Ultimate - 64 bits this path is actually : %WinDir%\SysWOW64

For more information see Service Control Manager at MSDN.

Thanks Harper Shelby for pointing out problem with orginal post.

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

will output the current directory. Put that code in the startup method of your service and use a tool like DebugView to check the output. Then you will know the startup folder of your service.

This simple technique will be useful with many problems in service development, especially to debug service startup.

You probably expected the working folder of your service to be the folder where the service executable is in (so did I). You can change to that folder using the following lines of code:

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

You can make it work like so:

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

Wanted also to know in which folder a Windows service was running but source code was not mine so could not modify it. Typing in Command Prompt sc qc <service name> displays the folder in BINARY_PATH_NAME.

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

when query MyService 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

From SC start service in folder /Start in:/: One simple alternative is to use nssm.cc - this gives you the option of specifying a directory to start in.