2011-01-31 3 views
5

디렉터리의 변경 내용을 찾는 안정적인 방법을 찾고 있습니다..NET Framework를 사용하여 디렉터리의 파일 변경을 모니터링하는 신뢰할 수있는 방법

FileSystemWatcher를 사용해 보았습니다. 그러나 많은 작은 파일을 만들거나 변경하거나 삭제할 때 오히려 부정확합니다. 그것은 나의 시험에있는 파일의 대략 1 2 %를 놓친다. 수천 개의 파일을 빠르게 추가하거나 변경할 때 상당히 많은 작업입니다.

다른 간격으로 500ms, 2000ms 등으로 폴링을 시도했습니다.이 경우에는 너무 많은 조회가 발생합니다. 이는 FileInfo 객체의 타임 스탬프 해결과 관련이있을 수 있습니다.

제 질문은; .NET Framework를 사용하여 디렉터리에 대한 변경 내용을 안정적으로 가져올 수 있습니까?

- 기독교

답변

7

InternalBufferSize을 늘려 보셨습니까? 어떤 크기로 설정하셨습니까? MSDN 가입일

: 버퍼 크기를 초과 할 때 은 FileSystemWatcher가 이벤트를 놓칠 수


참고. 누락 된 이벤트를 방지하려면 지침을 따르십시오. InternalBufferSize 속성을 설정하여 버퍼 크기를 늘리십시오. 긴 파일 이름이 버퍼 채우기에 에 기여하므로 긴 파일 이름을 가진 파일을 보지 마십시오 ( ). 이름을 사용하여이 파일의 이름을 더 짧게 변경하십시오.


는 가능한 한 짧게 이벤트 처리 코드를 유지합니다.

+0

고맙습니다. 지금 당장이 문제가 해결 될 것 같습니다. 64KB의 버퍼가있는 파일을 놓치지 못하게하려면 최적의 설정을 찾기 위해 몇 가지 테스트를 더 실행해야합니다. –

4

예, 적절한 모니터링이 파일 시스템 필터 드라이버를 사용하여 수행됩니다. 이러한 드라이버는 파일 시스템에 전송되는 모든 요청을 (파일 시스템에 도달하기 전이나 후에) 가로 챈다. 이렇게하면 모든 통지를 제 시간에 (또는 이벤트가 발생하기 전에) 얻을 수 있으며 요청이 통과하고 요청과 함께 전달되는 정보를 제어 할 수 있습니다.

직접 필터 드라이버를 작성하거나 (테스트를 위해 6 ~ 9 개월 정도의 작업을 수행 한 다음 테스트를 위해 많은 시간을 할애) 또는 CallbackFilter 제품을 사용하고 커널 모드 개발을 피할 수 있습니다. CallbackFilter는 .NET, VCL 및 네이티브 C++에 대한 사전 빌드 된 드라이버 및 API를 제공합니다.

+1

제안 해 주셔서 감사합니다. 유진 (Eugene), 실제로 폐지 된 프로젝트를 연구하기 전에 CallbackFilter를 살펴 보았습니다. 이것은 취미 프로젝트이므로 지금은 간단하게 유지해야합니다. 하지만 당신을 염두에 두겠습니다;) –

+3

@Eugene :이 답변은 몇 명의 사용자가 스팸으로 신고했습니다. 나는 그것이 (실제로 해당 지역의 전문가가 아니지만) 귀하의 제품과 유사 해 실제로 문제에 대한 해결책을 제공하기 때문에 그것이라고 확신하지는 않습니다. 그러나 앞으로는 자신의 제품을 홍보하는 것이 더 분명 해지도록 고려하는 것이 좋습니다. 아마 바닥이나 뭔가에 면책 조항. 그리고 downvotes 카운터 +1. –

+1

@Cody Grey - 사용자 이름과 함께 "our ... product"라는 문구가 나와 같이 매우 명확하게 말하면서 이것은 이전에 다루어졌으며 (Meta에서 논의되고 여기에서 테스트 됨) 받아 들여졌습니다. –

관련 문제