{C#}

윈도우 서비스 구현에서 파일을 참조할 때 주의사항

Ad


응용프로그램에서 파일을 참조하게 되면 먼저 실행파일이 존재하는 디렉터리에서 검색하고, 하위 폴더를 검색합니다. 그 위치에 없는 경우 %windir%\system32\ 디렉터리를 검색하고 존재하지 않으면 FileNotFoundException 이 발생합니다.

그런데, Windows Service 에서 파일을 이름으로 검색하면 Windows Service 실행파일의 위치가 아니라 %windir%\system32\ 디렉터리부터 검색을 시작하여 하위 디렉터리에 파일이 존재하지 않으면 FileNotFoundException 이 발생합니다.

Windows Service를 구현할 때, 파일을 이름으로 참조하지 말고 전체 경로를 사용하여 참조하는 것이 좋겠습니다.

아래 샘플코드의 file2와 같이 사용하길 권장합니다.

Windows Service 샘플코드

간단한 Windows Service 를 구현하고, Installer Project 로 설치 프로그램을 구현하여 설치한 후 실행합니다.

설치 위치는 %programfiles%\Company\SampleService\ 입니다.

protected override void OnStart(string[] args)
{
    string strAppConfigFilename = "SampleService.exe.config";

    string strAppConfigFilePath = string.Empty;
    strAppConfigFilePath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

    FileInfo file1 = new FileInfo(strAppConfigFilename);
    FileInfo file2 = new FileInfo(Path.Combine(strAppConfigFilePath, strAppConfigFilename));

    string strMessage = string.Empty;
    strMessage = String.Format("file1.Exists : {0}\r\nfile1 path : {1}\r\nfile2.Exists : {2}\r\nfile2 path : {3}", file1.Exists, file1.FullName, file2.Exists, file2.FullName);

    EventLog.WriteEntry(strMessage, EventLogEntryType.Information);
}

이벤트 뷰어 내용

file1.Exists : False
file1 path : C:\Windows\system32\SampleService.exe.config
file2.Exists : True
file2 path : C:\Program Files\Company\SampleService\SampleService.exe.config