В каком каталоге работает служба Windows?
Я создал очень простой.NET Windows Service и установил его с помощью утилиты InstallUtil.exe.
В сервисе у меня есть кусок кода как таковой:
if (File.Exists("test_file.txt"))
{
// Do something clever
}
Я создал файл с именем test_file.txt в том же каталоге, что и служба, но закомментированная часть кода никогда не выполняется...?
4 ответа
Службы запускаются из приложения под названием Service Control Manager. Это приложение живет в системном каталоге %WinDir%\System32
На Windows 7 Ultimate - 64 бита этот путь на самом деле: % WinDir% \ SysWOW64
Для получения дополнительной информации см. Диспетчер управления службами в MSDN.
Спасибо Харперу Шелби за указание на проблему с оригинальным постом.
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory());
выведет текущий каталог. Поместите этот код в метод запуска вашей службы и используйте инструмент, такой как DebugView, чтобы проверить вывод. Тогда вы будете знать папку запуска вашего сервиса.
Этот простой метод будет полезен при многих проблемах в разработке сервисов, особенно при отладке запуска сервиса.
Вы, вероятно, ожидали, что рабочая папка вашего сервиса будет папкой, в которой находится исполняемый файл сервиса (как и я). Вы можете перейти в эту папку, используя следующие строки кода:
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
Вы можете заставить его работать так:
string cwd = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
Directory.SetCurrentDirectory(cwd ?? ".");
Хотел также узнать, в какой папке запущена служба 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 в папке / Start in:/: Простая альтернатива - использовать nssm.cc - это дает вам возможность указать каталог для запуска.