2012-10-25 1 views
0

생성 된 파일이있는 경우 여러 디렉토리를 검사하는 FileSystemWatcher이 있습니다.FileSystemWatcher는 생성 된 이벤트를 건너 뜁니다.

  ((System.ComponentModel.ISupportInitialize)(FileMonitor)).BeginInit(); 
      FileMonitor.EnableRaisingEvents = true; 
      FileMonitor.Created += new FileSystemEventHandler(FileMonitor_Created); 
      FileMonitor.Path = Path.ToString(); 
      FileMonitor.IncludeSubdirectories = true; 
      FileMonitor.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Attributes; 
      ((System.ComponentModel.ISupportInitialize)(FileMonitor)).EndInit(); 

어떤 이유로 응용 프로그램을 실행할 때 FileMonitor_Created 이벤트가 발생하는 경우도 있습니다. 무작위로 느낀 ...

그러나 FileMonitor_Created 메서드에 중단 점을 넣으면 완벽하게 작동합니다. 중단 점이 설정된 경우 이벤트가 발생할 때마다 이벤트가 발생합니다.

FileMonitor에 대해 InterBufferSize를 설정해 보았지만 아무 효과가 없습니다.

업데이트 나는 Filemonitor에 Changed 이벤트를 추가하고 그것에게 Created 이벤트와 같은 핸들러를했다. 어떻게 든 파일은 실제로 생성되지만 변경되지는 않더라도 작동합니다.

나는 항상 중단 점을 설정할 때 '옛날 방식'을 사용했는지 궁금합니다.

답변

4

얼마나 많은 변경을하고 있습니까?

Windows 운영 체제는 FileSystemWatcher에 의해 생성 된 버퍼에 파일 변경 내용 을 구성 요소에 알립니다. 짧은 시간 내에 많은 변경 사항이 있으면 버퍼가 오버플로 될 수 있습니다. 이로 인해 구성 요소가 디렉터리의 변경 내용을 추적하지 못하게되고 만 포괄적 알림을 제공합니다. InternalBufferSize 속성을 사용하여 버퍼 크기를 늘리는 것은 디스크에 스왑 아웃 할 수없는 비 페이징 메모리에서 발생하므로 파일 변경 이벤트를 놓치지 않을 정도로 작지만 크기는 작습니다. 버퍼 오버플로를 방지하려면 NotifierFilter 및 IncludeSubdirectories 속성을 사용하여 원치 않는 변경 내용을 필터링 할 수 있습니다. 알림.

는 FileMonitor_Created 이벤트에서 MSDN

+0

그것은 한 번에 하나 개의 파일입니다, InternalBufferSize 문제 – Chumbawamba

0

중단 점이 작동하지만, 그렇지 않은 경우에는 그렇지 않은가요?

이벤트 처리기에 무언가가 없습니까? 예외적으로 예외가 발생하는 것처럼 프로그램이 아무 것도하지 않는 것처럼 느끼게합니다. 핸들러에 코드를 게시 할 수 있습니까?

0

별도의 비즈니스 로직에서 촬영. 이벤트 매개 변수를 저장할 때 을 반환해야합니다. 예. 대기열에 이벤트 매개 변수를 저장 한 다음 이러한 이벤트를 비동기로 처리하십시오.

+0

내가 파일을 이동하고있는 BackgroundWorker에 (비동기)를 시작하고 안 처리기, 아무것도. – Chumbawamba

0

FileMonitor.Created는 파일이 만들어지고 이전 파일과 동일한 만든 날짜 시간으로 바뀌지 않을 때 발생합니다.

시나리오 1) 파일 만들기 날짜 또는 파일 내용을 변경하지 않고 입력 폴더에 동일한 abc.txt 파일을 붙여 넣습니다. 파일 감시자가 파일을 인식하지 못합니다.

시나리오 2) 붙여 넣기를 복사하고 새로운 생성 날짜 파일 감시자와 입력 폴더에 바로 같은 파일을 통해

그래서 생성 된 이벤트가 두 번째 시나리오와 함께 작동하여 파일을 인식, 당신의 상황을 수 있지만 숨겨진 보이는하지 않을 수 있습니다 내 첫 번째 관점에 대한 행동.

0

이벤트가 발생하면 파일 처리에 다소 시간이 걸릴 수 있습니다. 그 시간 동안 다른 파일이 작성되고 이벤트 핸들러가 첫 번째 파일을 계속 처리하고 있으므로 두 번째 파일을 처리하지 않습니다. 따라서 두 번째 파일은 FileSystemWatcher에 의해 누락되었습니다.

해결책은 파일 탐지 양식 파일 처리를 두 개의 스레드로 분리 한 다음 대기열에 연결하는 것입니다. 생산자 - 소비자 대기열입니다.

파일 탐지는 가능한 짧아야합니다. 파일 만 탐지하고 파일 처리 스레드가 처리하고 닫을 수있는 대기열에 파일 이름을 대기열에 추가하여 다른 파일을 감지 할 수 있어야합니다. 파일 처리 스레드는 파일 이름을 대기열에서 제외하고 처리하는 데 많은 시간이 걸릴 수 있습니다.

내가이 문서의 코드를 자세하게 설명 : FileSystemWatcher skips some events