2012-06-14 2 views
1

Windows 2003에서 Windows 서비스를 실행하고 있습니다. 지난 달 동안 매일 코드를 추가/변경했는데 파일 워처가 지난 달 동안 매일 작동했습니다. 그러나, 그것은 이상한 이유로 오늘 일하는 것을 멈췄습니다. 이전 코드로 되 돌리면 여전히 이벤트가 발생하지 않습니다. Win7 머신에서 동일한 코드를 테스트했는데 정상적으로 작동합니다. 나는 외부 프로세스가 간섭한다고 가정하고 있지만 무엇을 찾을 지조차 확신하지 못합니다. 디버그 문을 통해Windows 서비스의 FileWatcher가 갑자기 작동하지 않습니다.

private void InitializeComponent() 
    { 
     this.processfileWatcher = new System.IO.FileSystemWatcher(); 
     ((System.ComponentModel.ISupportInitialize) (this.processfileWatcher)).BeginInit(); 
     this.processfileWatcher.EnableRaisingEvents = true; 
     this.processfileWatcher.Filter = "done.txt"; 
     this.processfileWatcher.Changed += new System.IO.FileSystemEventHandler(this.processfileWatcher_Changed); 
     this.ServiceName = "Service1"; 
     ((System.ComponentModel.ISupportInitialize)(this.processfileWatcher)).EndInit(); 

    } 

private void processfileWatcher_Changed(object sender, System.IO.FileSystemEventArgs e) 
    { 
     try 
     { 
      processfileWatcher.EnableRaisingEvents = false; 
      //Do stuff here 
      Debug.WriteLine(" End of processfileWatcher for: " + e.FullPath); 
     } 

     finally 
     { 
      processfileWatcher.EnableRaisingEvents = true; 
     } 

    } 

내가 내 ONSTART() 메소드의 끝에 도달하고 있음을 확인 할 수 있습니다

여기에 관련 코드입니다.

+0

어디 당신은 FileSystemWatcher의 경로 속성을 설정하는? –

+0

/onstart/onstop 메서드가있는 클래스의 생성자에서 public Ex() { Settings = new Settings(); InitializeComponent(); processfileWatcher.Path = Settings.ProcessFolder; } – user1287523

+0

내가 왜 당신에게 효과가 있는지 모르겠지만 몇 가지 일반적인 코드 제안 사항이 있습니다 : 1)'FileSystemWatcher'를'FileSystemWatcher'로 형변환 할 필요가 없습니다. 2) Init 코드 안에 Path 필드를 설정하는 것이 좋습니다. –

답변

0

무언가가 급격한 디스크 변경을 많이 일으키면 찾고있는 것을 잡을 기회가 있기 전에 버퍼가 부족할 수 있습니다. 그렇지 않으면 모니터링중인 내용에 대해 서비스 자격 증명이 작동하지 않을 수 있습니다.

명시 적 권한을 부여한 다음 fileystemwatcher의 오류 이벤트에 대한 처리기를 추가하여 버퍼 문제를 찾으십시오.

http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.error%28v=vs.100%29.aspx

+0

감사 드려요. 디스크 클리너가 실행 중이고 약 35MB의 공간 만 남았 기 때문에 오래된 파일을 압축하려고 시도했으나 무언가를 일으킨 것으로 의심되면 프로세스를 종료했습니다.나는 내일 사무실에 도착해서보고 할 때 당신의 제안을 제일 먼저 시도 할 것입니다. 감사! 호기심에서 벗어난 – user1287523

+0

, 결국 무엇을 발견 했습니까? – Bill

+0

나는 그것이 모두 작동했지만 디버그 문을 출력하지 않아서 트리거되지 않았다고 생각했었다. 나는 새로운 질문을 열었다. – user1287523

0

this.processfileWatcher.Created 이벤트로 테스트 해보고 새 파일을 만들 때 계속 발생하는지 확인하십시오. NotifyFilter 속성을 수동으로 설정 (doc)하고 작동하는지 확인해보십시오.

+0

다른 디렉토리를 선택하는 것뿐만 아니라 Created로 변경했지만 어떤 이벤트도 발생시키지 않습니다. – user1287523

+0

네트워크 드라이브 나 다른 것을보기 위해 동일한 디렉토리를 보거나 변경 했습니까? 한가지 더, 디버거를 사용하여 progam에 디버그 연결을 사용하여 Windows 서비스 프로그램을 디버깅 할 수 있습니다. 링크를 참조하십시오 [http://msdn.microsoft.com/en-us/library/7a50syb3%28v=vs.100%29.aspx] – ArmenB

+0

디버거를 연결하려고하는데, m 관리되지 않는 혼합 된 코드를 사용합니다. 디버깅을 관리하도록 설정하려고하지만 속성 페이지 창에서 구성 속성 아래에 디버그 옵션이 표시되지 않습니다. 파일 워처가 정상적으로 실행되고 있지만 이전 코드에서 실행되는 .exe 파일이 실행되는 것을 발견했습니다. 왜 이런 일이 일어나고 있는지 모르겠습니다. 심지어 파일 시작 부분에 디버그 문을 가지고 있지만 디버그 뷰에 아무 것도 나타나지 않습니다. exe는 filewatcher 메서드가 없습니다. – user1287523

관련 문제