2008-09-11 5 views
17

파일 활동이 많은 경우 ReadDirectoryChangesW API 함수 누락 된 파일에 대한 인터넷 게시물이 많이 있습니다. 대부분 ReadDirectoryChangesW 함수 루프가 호출되는 속도를 비난합니다. 이것은 잘못된 가정입니다. 내가 본 가장 좋은 설명은 다음 포스트 월요일, 14 일 코멘트 2008 오후 2시 15분 27초누락 된 파일 변경 내용을 ReadDirectoryChangesW 유지하는 방법

입니다

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/4465cafb-f4ed-434f-89d8-c85ced6ffaa8/

요약은 그들이 떠날로 ReadDirectoryChangesW 함수 보고서의 파일 변경 사항을 것입니다 파일 쓰기 대기열에 추가됩니다. 그리고 커밋되기 전에 너무 많은 항목이 추가되면 일부 항목에 대해주의를 잃게됩니다. 디렉토리에 1000 개 이상의 파일을 생성하는 프로그램을 작성한 경우 실제 구현과 함께이를 볼 수 있습니다. 얼마나 많은 파일 이벤트 알림을 받는지 계산하십시오. 모든 이벤트 알림을받지 못할 때가 있습니다.

질문은 매번 볼륨을 플러시하지 않고도 ReadDirectoryChangesW 기능을 사용하는 신뢰할 수있는 방법을 찾았습니까? 사용자가 관리자가 아니며 완료하는 데 약간의 시간이 걸리는 경우에는 허용되지 않습니다.

답변

1

API가 신뢰할 수없는 경우 해결 방법이 유일한 옵션 일 수 있습니다. 물론 마지막으로 수정 된 파일 이름을 추적해야합니다. 이것은 변경 사항을 찾을 때 폴링해야한다는 것을 의미하는 것이 아니라 검사를 트리거하는 수단으로 FileSystemWatcher를 사용할 수 있다는 것을 의미하지는 않습니다. 당신이 이것을 감지하고 모든 파일을 얻을 수있는 특별한 조건을 트리거 할 수 있습니다,

그래서 당신은 ReadDirectoryChangesW이 /FSW 이벤트가 일어난 지난 50 ~ 100 시간의 추적을 유지하는 경우, 당신은이 신속하게 호출되는 것을 볼 몇 초 후에 변경된 (그리고 일시적인 FSW 이벤트를 방지하기위한 플래그를 설정합니다).

일부 사용자는이 솔루션에 대한 의견에 혼란을 느끼기 때문에 ReadDirectoryChangesW에서 이벤트가 얼마나 빨리 도착하는지 모니터링하고 너무 빨리 도착할 경우 해결 방법을 시도해보십시오 (일반적으로 수동 스윕 디렉토리).

+1

약 99 %의 시간 동안 작동합니다. 다른 디렉토리의 파일 (파일 변경이 많은 파일 이외의 파일)이 건너 뛴 파일 인 경우 어떻게됩니까? 한 디렉토리에서 변경 사항을 검사하지만 다른 디렉토리에서 단일 파일 변경 사항을 놓치게됩니다. –

+0

FileSystemWatcher 클래스는 .NET에서 ReadDirectoryChangesW를 래핑하는 방법이므로 No는 도움이되지 않습니다. – Garen

+0

내 대답은 일정 기간 내에 ReadDirectoryChangesW에 대한 대안을 트리거하는 이벤트 수를 감지하는 것에 관한 것입니다. – hova

0

같은 문제가 발생했습니다. 그러나 모든 사건을 해결할 수있는 해결책을 찾지 못했습니다. 여러 테스트에서 ReadDirectoryChangesW 함수는 GetQueuedCompletionStatus 함수가 반환 된 후 최대한 빨리 호출되어야한다는 것을 알 수있었습니다. 파일 시스템의 처리 속도가 내 응용 프로그램 처리 속도보다 빠르면 응용 프로그램이 일부 이벤트를 잃을 수도 있습니다.

어쨋든 필자는 모니터링 논리에서 구문 분석 논리를 분리하고 스레드에 구문 분석 논리를 배치했습니다.

+0

비슷한 것을 사용하여 문제를 성공적으로 해결했습니다. 나중에 처리하기 위해 이벤트를 대기 시키거나 파일에 기록하십시오. 그들을 디스크에 쓰는 것이 나를위한 열쇠였습니다. 느린 것처럼 보일 수도 있지만 디스크가 캐시되고 오버 헤드가 DB보다 적습니다. 내 프로그램은 하루에 약 1TB의 파일 변경 - 수십만 개의 파일 -을 반영합니다. – SilentSteel

1

ReadDirectoryChangesW가 100 % 신뢰할 수 있다는 것을 결코 보지 못했습니다. 그러나 그것을 처리하는 가장 좋은 방법은 "보고"와 "처리"를 분리하는 것입니다.

내 구현에는 모든 이벤트를 다시 대기시키기 위해 하나의 작업 만있는 스레드가 있습니다. 그런 다음 중간 대기열을 처리하는 두 번째 스레드. 당신은 기본적으로 가능한 한 사건의보고를 방해하고 싶습니다.

높은 CPU 상황에서는 감시자 이벤트의보고를 방해 할 수도 있습니다.

+0

나는 위에 언급할만한 명성이 없기 때문에 최고의 해결책은 매우 훌륭하다고 말할 것이다. 거의 99 %의 경우에 "거의"있습니다. 한 가지 더 추가하면 변경 사항을 찾기 위해보고있는 폴더를 정기적으로 전체 다시 검색합니다. – Lompican

관련 문제