В каком каталоге работает служба Windows?

Я создал очень простой .NET Windows Service и установил его с помощью утилиты InstallUtil.exe.

В сервисе у меня есть кусок кода как таковой:

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

Я создал файл test_file.txt в том же каталоге, что и служба, но прокомментированная часть кода никогда не выполняется...?

Ответ 1

Службы запускаются из приложения, называемого Service Control Manager. Это приложение находится в системном каталоге % WinDir%\System32

В Windows 7 Ultimate - 64 бит этот путь на самом деле: % WinDir%\SysWOW64

Для получения дополнительной информации см. Service Control Manager в MSDN.

Спасибо Харпер Шелби за то, что он указал на проблему с оригинальной почтой.

Ответ 2

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

выводит текущий каталог. Поместите этот код в метод запуска вашей службы и используйте инструмент, например DebugView, чтобы проверить вывод. Затем вы узнаете папку автозагрузки своей службы.

Этот простой метод будет полезен со многими проблемами в разработке сервисов, особенно для отладки запуска сервиса.

Вероятно, вы ожидали, что рабочая папка вашей службы будет папкой, в которой находится исполняемый файл службы (так же, как и я). Вы можете перейти в эту папку, используя следующие строки кода:

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

Ответ 3

Вы можете заставить его работать так:

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

Ответ 4

Хотелось также узнать, в какой папке работает служба 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