2013-04-07 2 views
2

파일 시스템의 폴더를 모니터링하고 싶습니다. C : 나는 폴더를 모니터링 할 가정 해 봅시다 \ MyNewFolderFindFirstChangeNotification이 변경 사항에 대해 두 번 통보하고 있습니다

내가 할 수있는이 코드가 있습니다

HANDLE ChangeHandle=FindFirstChangeNotification(_T("C:\\\MyNewFolder"),FALSE,FILE_NOTIFY_CHANGE_LAST_WRITE); 
for(;;) 
{ 
    DWORD Wait=WaitForSingleObject(ChangeHandle,INFINITE); 
    if (Wait == WAIT_OBJECT_0) 
    { 
     MessageBox(NULL,_T("Change"),_T("Change"),MB_OK); 
     FindNextChangeNotification(ChangeHandle); 
    } 
    else 
    { 
     break; 
    } 
} 

내가 내 폴더의 모든 파일 변경에 관하여 저를 알리는 메시지 박스를 갖고 싶어합니다. 그 코드는 잘 작동하지만 한 가지 문제가 있습니다. 문제는 각 변경 사항에 대해 2 통의 통지가 있다는 것입니다. 내 코드의 문제점은 무엇입니까? 감사합니다. .

답변

7

이것은 전적으로 정상입니다. 파일을 변경하면 대개 파일 항목을 변경하고 디렉토리 항목을 변경해야합니다. 파일 길이 및 최종 쓰기 날짜와 같은 메타 데이터 속성이 여기에 저장됩니다. 그러면 두 가지에 대한 알림을 받게됩니다. ReadDirectoryChangesW()는이 두 가지를 구분하지 않습니다.

동일한 파일을 여러 번 변경하는 프로세스와 다르지 않습니다. 두 조건을 모두 처리 할 수 ​​있어야합니다. 이것은 대개 타이머와 관련되므로 알림에 대해 수행하는 작업의 수와 함께하지 마십시오. 이러한 타이머는 또한 파일을 변경하는 프로세스가 파일에 아무 것도 수행하지 못하도록 잠겨 있기 때문에 종종 필요합니다. 프로세스가 파일을 닫을 때까지는 나중에 일정한 시간이 지나지 않습니다.

2

한 파일에 여러 변경 사항 (예 : 파일을 만들고 작성한 파일 또는 여러 번 작성한 파일 등)이 표시 될 수 있습니다. 불행히도 FindFirstChangeNotification은 실제로 어떤 일이 발생했는지 알려주지 않습니다.

파일 알림을 위해 ReadDirectoryChangesW을 사용하는 것이 더 편할 것입니다. 은 무엇이 변경되었는지으로 변경했습니다.

관련 문제