Windows服务运行的目录是什么?

时间:2009-05-19 20:53:51

标签: .net windows-services

我创建了一个非常简单的.NET Windows服务,并使用InstallUtil.exe实用程序安装它。

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

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

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

5 个答案:

答案 0 :(得分:92)

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

将输出当前目录。将该代码放在服务的启动方法中,并使用DebugView之类的工具检查输出。然后您将知道您的服务的启动文件夹。

这种简单的技术对于服务开发中的许多问题都很有用,特别是对于调试服务启动。

您可能希望服务的工作文件夹成为服务可执行文件所在的文件夹(我也是如此)。您可以使用以下代码行更改为该文件夹:

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

答案 1 :(得分:67)

服务从名为Service Control Manager的应用程序启动。此应用程序位于系统目录%WinDir%\ System32

在Windows 7 Ultimate - 64位上,此路径实际上是:%WinDir%\ SysWOW64

有关详细信息,请参阅Service Control Manager at MSDN

感谢Harper Shelby指出了原始帖子的问题。

答案 2 :(得分:11)

你可以这样工作:

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

答案 3 :(得分:1)

还想知道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:&gt; 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

答案 4 :(得分:0)

来自SC start service in folder /Start in:/: 一个简单的替代方法是使用nssm.cc-这使您可以选择指定要开始的目录。