2009-05-19 3 views
56

아주 간단한 .NET Windows 서비스를 만들고 InstallUtil.exe 유틸리티를 사용하여 설치했습니다.Windows 서비스는 어떤 디렉터리에 있습니까?

서비스에서

나는 같은 코드의 조각을 가지고

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

나는 결코 존재하지 않습니다 서비스하지만, 코드의 주석 부분과 같은 디렉토리에 test_file.txt라는 파일을 만들었습니다 처형 됐어?

+0

합니까 파일에 올바른 사용 권한이있는 서비스를 실행하는 사용자? – CSharpAtl

답변

51

서비스는 Service Control Manager라는 응용 프로그램에서 시작됩니다. 이 응용 프로그램은 윈도우 7 궁극의 시스템 디렉토리 의 % windir % \ system32를

에 살고있는 -이 경로가 실제로 64 비트 : 자세한 내용은 %의 WINDIR %의 \ SysWOW64와

Service Control Manager at MSDN를 참조하십시오.

원래 게시물에 문제가 있음을 지적 해 주신 Harper Shelby에게 감사드립니다.

+1

svchost.exe는 대부분의 내부 Windows 서비스를위한 서비스 호스트입니다. 서비스는 비 Windows 서비스의 경우 다른 exe 호스트에서 실행될 가능성이 높습니다. – Michael

+2

올바른 디렉토리, 잘못된 이유. –

+1

감사합니다 - 거기에 파일을 삭제하면 작동 위치를 확인할 수 있습니다 : c : \ windows \ system32 – Guy

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

은 현재 디렉토리를 출력합니다. 이 코드를 서비스 시작 방법에 넣고 DebugView 같은 도구를 사용하여 출력을 확인하십시오. 그런 다음 서비스의 시작 폴더를 알 수 있습니다.

이 간단한 기술은 서비스 개발의 많은 문제, 특히 서비스 시작을 디버그하는 데 유용합니다.

아마도 서비스의 작업 폴더가 서비스 실행 파일이있는 폴더가 될 것으로 예상했을 것입니다.

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

그건 아주 멋진 팁 - 감사합니다! – Guy

+1

+! 문제의 좋은 해결 방법. –

11

당신은 그렇게처럼 작동 할 수 있습니다 :

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

+1을 사용하면 응용 프로그램의 나머지 부분이 마치 현재 호출 된 곳의 경로 인 정상적으로 호출 된 .exe처럼 작동 할 수 있습니다. 고마워,이게 내가 필요한거야! 상대 경로를 사용하는 코드를 다시 작성하지 않아도됩니다. – Paul

2

이있는 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의 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 
+0

이것은 서비스 바이너리가 위치한 경로로, (서비스) 프로세스가 가동되는 동안 여러 번 변경 될 수있는 서비스의 "현재 작동중인"디렉토리와 동일하지는 않습니다. 상대적 파일 이름 (OP 예제에서와 같이)은 실행 가능 바이너리가 위치한 디렉토리가 아니라 현재 작업 디렉토리에 대해 확인됩니다. –

+0

'sc qc apache2.4'는'... BINARY_PATH_NAME : "를 보여줍니다 : E : \ root \ Public Cache \ Apache Httpd \ http.2-2.4.20-x86-vc11 \ Apache24 \ bin \ httpd.exe"-k runservice', 대신 작업 디렉토리는'% WinDir % \ System32'입니다. – Pacerier

관련 문제