2011-09-15 3 views
0

나는이 일을 올바르게하고 있습니까?ReadDirectoryChangesW는 아무 것도하지 않습니다. C++

나는 C라는 폴더에서 일어난 모든 변경 사항 찾기 위해 노력하고있다 : ReadDirectoryChangesW, 그것은 단지 거기에 내동댕이 후 \ 펄

합니다. 앞으로 나아지지 않습니다. 나는 명백한 것을 놓치고 있는가?

나는 달성하기 위해 노력하고 있어요 :

How can I detect only deleted, changed, and created files on a volume? 일단 매일, 나는 백업 프로그램을 실행하려는 의지가 백업 특정 폴더 아래에 변경된 파일 만.

int _tmain(int argc, _TCHAR* argv[]) 
{ 
TCHAR szBuffer[640] = {0}; 
DWORD dwOffset = 0; 
FILE_NOTIFY_INFORMATION* pInfo = NULL; 
DWORD dwBytes; 
HANDLE hFolder = CreateFile(L"C:\\Perl", FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); 
cout<<"Hello"<<endl; 
ReadDirectoryChangesW(hFolder, szBuffer, sizeof(szBuffer)/sizeof(TCHAR), FALSE, FILE_NOTIFY_CHANGE_FILE_NAME, &dwBytes, NULL, NULL); 
cout<<"Done"<<endl; 
do 
{ 
    // Get a pointer to the first change record... 
    pInfo = (FILE_NOTIFY_INFORMATION*) &szBuffer[dwOffset]; 

    // ReadDirectoryChangesW processes filenames in Unicode. We will convert them to a TCHAR format... 
    TCHAR szFileName[MAX_PATH] = {0}; 

    wcout<<pInfo->FileName<<"\t"<<pInfo->Action ; 
    //WideCharToMultiByte(CP_ACP, NULL, pInfo->FileName, pInfo->FileNameLength, szFileName, sizeof(szFileName)/sizeof(TCHAR), NULL, NULL); 

    // Perform your tests here... 
    if (pInfo->Action == FILE_ACTION_ADDED) 
    { 
    } 

    // More than one change may happen at the same time. Load the next change and continue... 
    dwOffset += pInfo->NextEntryOffset; 
} 
while (pInfo->NextEntryOffset != 0); 

}

+1

비동기로 만들려면 OVERLAPPED를 사용해야합니다. –

답변

2

당신은 동기 모드에서 호출되므로 보고서의 변경이있을 때까지 반환 아니에요. 이는 의도적으로 설계된 동작입니다.

documentation의주의 절에서는 비동기 적으로 호출하는 방법을 설명합니다.

을 보시려면 뭔가가 변경된 경우가 있습니다. 그렇다면 찾고있는 API가 아닙니다. 내용을 반복하고 각 파일의 생성 및 수정 타임 스탬프를 확인할 수 있습니다. 삭제를 알리고 싶다면 지난 시간에 발견 한 내용을 추적하고 이번에는 아직 남아 있는지 확인해야합니다.

+0

그래, 파일 내용이 변경되면 보관 비트를 확인하기 만하면됩니다. 각 파일에 가서 수정되었는지 확인하는 데 너무 오래 걸리기 때문에 그렇게하지 않는 것이 좋습니다. 대부분의 안티 바이러스 및 백업 응용 프로그램은 주어진 볼륨에서 발생하는 모든 변경 사항에 대한 기록이있는 변경 저널을 사용합니다. 그 대안에 대해 알고 계시나요? – roymustang86

+0

ReadDirectoryChanges 소개에는 원하는 링크가 있습니다. http://msdn.microsoft.com/en-us/library/aa363798(v=vs.85).aspx –

+0

모니터링 할 파일 및 디렉터리의 양 예를 들어 전체 볼륨과 같이 중요하다면 NTFS 변경 저널을 사용하는 것이 좋습니다. 모든 파일을 수동으로 검사하고 타임 스탬프 및 특성을 검사하는 것보다 Windows API를 선호합니다. – AJG85

관련 문제