[.net] Windows 서비스는 어떤 디렉토리에서 실행됩니까?

매우 간단한 .NET Windows 서비스를 만들고 InstallUtil.exe 유틸리티를 사용하여 설치했습니다.

서비스에는 다음과 같은 코드가 있습니다.

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

서비스와 동일한 디렉토리에 test_file.txt라는 파일을 만들었지 만 코드의 주석 처리 된 부분이 실행되지 않습니다 …?



답변

서비스는 Service Control Manager라는 응용 프로그램에서 시작됩니다. 이 응용 프로그램은 시스템 디렉터리 % WinDir % \ System32에 있습니다.

Windows 7 Ultimate-64 비트에서이 경로는 실제로 : % WinDir % \ SysWOW64입니다.

자세한 내용은 MSDN의 서비스 제어 관리자를 참조하십시오 .

원래 게시물의 문제를 지적 해 주신 Harper Shelby에게 감사드립니다.


답변

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 시작 서비스 / 시작의 : / : 하나 개의 간단한 대안은 사용 nssm.cc에 – 이것은 당신의 시작 디렉토리를 지정하는 옵션을 제공합니다.


답변