如何处理ReadDirectoryChangesW()的多个通知?

时间:2014-10-30 09:40:44

标签: readdirectorychangesw

我使用ReadDirectoryChangesW()函数实现了特定目录文件的任何更改信息。

但是,API向我发送了重复的通知。例如,我只使用FILE_NOTIFY_CHANGE_SIZE标志监视目录“C:\ abc \”而不监视子目录。并且,我尝试编辑并在目录中保存图像文件。 ex)C:\ abc \ imageFile.png

然后,我发送了两个或更多的通知。实际上,我理解为什么会有多个通知。我读了这篇文章。 (http://blogs.msdn.com/b/oldnewthing/archive/2014/05/07/10523172.aspx) 但是,我不知道如何处理多个通知。

我的目标是在更改图像时同步某些win32应用程序上的图像文件。

1 个答案:

答案 0 :(得分:0)

FILE_NOTIFY_INFORMATION的文档告诉我们:

  

NextEntryOffset   必须跳过才能到达下一条记录的字节数。 值为零表示这是最后一条记录。

所以我们检查那个字段,如果它不是零,我们创建一个新的指针,它是旧指针的许多字节。代码看起来像这样:

FILE_NOTIFY_INFORMATION* p = &s.changeInformation;
while (1) {
    std::wcout << L"    action " << p->Action << L"\n";
    std::wcout << L"    file ";
    std::wcout.write(p->FileName, p->FileNameLength / sizeof (wchar_t)) << L"\n";
    if (!p->NextEntryOffset) break;
    p = reinterpret_cast<decltype(p)>(p->NextEntryOffset + reinterpret_cast<uintptr_t>(p));
}

我们必须强制转换,因为值以字节为单位,指针算法自动测量对象中的距离而不是字节。