FindFirstChangeNotification两次通知有关更改

时间:2013-04-07 17:08:36

标签: c++ windows winapi

我想要监控文件系统中的文件夹。假设我要监视文件夹:C:\ MyNewFolder

我有这个代码来做:

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次通知。我的代码有什么问题? 感谢。

2 个答案:

答案 0 :(得分:7)

这是完全正常的。对文件的更改通常涉及对文件数据的更改以及对目录条目的更改。文件长度和上次写入日期等元数据属性存储在那里。所以你会收到两者的通知。 ReadDirectoryChangesW()没有区分这两者。

这与对同一文件进行多项更改的流程没有什么不同。一定要能够处理这两个条件。这通常涉及一个计时器,因此您不会过度使用您在通知上执行的操作数量。这样的计时器通常也是必需的,因为正在更改文件的进程仍然锁定它会阻止您对该文件执行任何操作。在进程关闭文件之前,以后会有不确定的时间。

答案 1 :(得分:2)

您可能看到的是对一个文件的多个更改(例如,正在创建的文件,然后写入,或者多次写入文件等)。不幸的是FindFirstChangeNotification没有告诉你实际发生了什么。

您最好使用ReadDirectoryChangesW进行文件通知,因为它实际上会告诉您 已更改。