ReadDirectoryChangesW ничего не делает C++

Я делаю это правильно?

Я пытаюсь найти все изменения, которые произошли в папке с именем C:\Perl

После ReadDirectoryChangesW он просто застревает там. Это не продвигается вперед. Я что-то упускаю из виду?

Я пытаюсь достичь: Как я могу обнаружить только удаленные, измененные и созданные файлы на томе?

Один раз в день я хочу запустить программу резервного копирования, которая будет создавать резервные копии только тех файлов, которые были изменены в определенной папке.

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 ответ

Решение

Вы вызываете его в синхронном режиме, поэтому он не возвращается, пока не будет внесено изменение в отчет. Это по замыслу.

Раздел "Примечания" в документации объясняет, как вызывать его асинхронно.

Похоже, что вы хотите, чтобы увидеть, если что-то изменилось с какого-то момента времени. Если так, то это не тот API, который вы ищете. Вы можете перебирать содержимое и проверять временные метки создания и изменения для каждого файла. Если вы хотите заметить удаление, вам нужно будет отследить, что вы нашли в прошлый раз, и проверить, все ли еще там в этот раз.

Другие вопросы по тегам