2012-02-13 6 views
2

새 파일을 확인하고 데이터베이스에 내용을 저장하고 파일을 삭제하도록 FileSystemWatcher를 설정했습니다. 약 10 일 전에 일부 파일을 무시하기 시작했습니다. 우리는 총 50,000 개의 파일 중 1,500 개의 파일을 의미합니다. 수동으로 파일을 다른 디렉토리로 이동 한 다음 감시 된 디렉토리로 다시 이동하면 파일이 감지됩니다.FileSystemWatcher가 작동하지 않는 경우가 있음

InternalBufferSize는 큰 일괄 처리를 처리하기 위해 32 kB로 설정됩니다. 문제없이 한 번에 300 개 이상의 파일을 처리합니다. 현실은 그와 거의 비슷하지 않습니다.

FileSystemWatcher와 관련없는 변경 사항으로 40 일 전에 프로그램을 마지막으로 변경했습니다. 1 년 넘게 생산되었습니다. 서버 부하에서 스파이크가 보이지 않습니다.

갑자기 이와 같은 문제가 발생할 수있는 원인은 무엇입니까? FileSystemWatcher가 단순히 unreliable 일 가능성이 있습니까?

1000 개의 파일이 만들어지는 테스트를 만들었습니다. 실행 후 이벤트 로그에 3,000 개의 항목이 있습니다. 그래서 버퍼 오버 플로우가 문제가되지 않는다고 생각합니까? 여러 가지 방법으로 프로그램을 테스트하고 또 다시 코드를 확인

private void button1_Click(object sender, EventArgs e) 
    { 
     fsw = new FileSystemWatcher(); 
     fsw.Path = @"C:\temp\fsw-test"; 
     fsw.IncludeSubdirectories = false; 
     fsw.NotifyFilter = NotifyFilters.FileName; 
     fsw.Created += new FileSystemEventHandler(fsw_Created_handler); 
     fsw.EnableRaisingEvents = true; 
     fsw.InternalBufferSize = 32768; 
     fsw.Error += fsw_Error_handler; 
    } 

    private void fsw_Created_handler(object sender, FileSystemEventArgs e) 
    { 
     new Thread(new ParameterizedThreadStart(work)).Start(e); 
    } 

    private void fsw_Error_handler(object sender, ErrorEventArgs e) 
    { 
     EventLog.WriteEntry("few test", e.GetException().Message); 
    } 

    private void work(object e) 
    { 
     try 
     { 
      EventLog.WriteEntry("fsw test", "Queueing File Started"); 
      Thread.Sleep(10000); 
      EventLog.WriteEntry("fsw test", ((FileSystemEventArgs)e).Name); 
      EventLog.WriteEntry("fsw test", "Queueing File Done"); 
     } 
     catch (Exception ex) 
     { 
      EventLog.WriteEntry("fsw test", "Error = " + ex.StackTrace + " *** " + ex.ToString()); 
     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     for (int i = 1; i <= 1000; i++) 
     { 
      System.IO.File.Create(@"C:\temp\fsw-test\" + i); 
     } 
    } 

편집 2 스트레스는 아무런 문제는 없었다. 지금은 재현 할 수없는 버그입니다. 로그를 더 자주 만들고 상황을 모니터링하기 위해 몇 가지 변경 작업을 수행 할 것입니다.

+0

내가 줄 수있는 유일한 조언은 'FileSystemWatcher'에 대한 옵션 중 일부가 매우 신빙성이 있다는 것입니다. 내가 그것을 사용할 때, 나는 내가 읽었던/쓰는/편집을 잡을 것이라고 생각했던 것을 설정했지만, 그것들 모두를 잡는 것은 아니었다. 아마도 파일이 "만들어지는"방법에 대한 새로운 "사례"가 등장했을 것이고 FSW는이를 잡기 위해 설정되지 않았지만 여전히 "이동"을 잡아서 하나의 디렉토리에서 다른 디렉토리로 이동시키는 이유입니다 공장. – Origin

+0

@Origin 모든 파일이 시스템에 똑같은 방식으로 입력됩니다. – Stijn

+0

워처에서 '오류'이벤트를 모니터링하고 있습니까? – adrianm

답변

0

멀티 스레딩으로 인해 문제가 Queue으로 밝혀졌습니다.

2

파일 이벤트가 큐에 저장되지 않습니다. 파일을 처리하고 새 파일이 작성되면 이벤트를 놓치게됩니다.

이 문제를 해결하는 한 가지 방법은 새 파일 이벤트가 발생하면 파일에서 작업 한 다음 반환하기 전에 새 파일을 확인하십시오. 파일이 남아 있지 않을 때까지 반복하십시오.

+0

이것이 사실이라면 해결 방법으로는 불가능할 수도있는 고유의 경주가 있습니다 (작은 경우 라 할지라도). 이벤트 처리기가 새 파일이 없다고 결정한 후에는 파일 시스템 변경이 발생할 수있는 짧은 시간이 항상있을 것입니다 제어가 이벤트를 시작하는 모든 것으로 돌아 가기 전에. –

+0

'Created' 이벤트에 대한 핸들러는 실제 처리를 수행 할 때마다 새 스레드를 시작합니다. 질문에서 언급했듯이 디렉토리에 300 개 이상의 파일을 삭제할 수 있으며 그 중 하나만 처리됩니다.아니면 내가하는 말을 오해 한 것입니까? 해결 방법은 실제로 가능하지만 FileSystemWatcher를 완전히 삭제하고 정기적으로 파일 디렉토리를 폴링 할 수도 있습니다. – Stijn

+0

쉽게 확인할 수 있습니다. 이벤트 처리기에서 10 초간 잠자 요. 코드가 잠자고있는 동안 새 파일을 만들고 다른 이벤트가 있는지 확인하십시오. 나는 우리를 위해 일한 하나의 해결 방법을 제안했다, 나는 다른 것들이있을 것이라고 확신한다. –

관련 문제