5

我想监视我的文件系统中的一个文件夹。假设我要监视文件夹: 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 个通知。我的代码有什么问题?谢谢。

4

2 回答 2

10

这是完全正常的。对文件的更改通常涉及对文件数据的更改以及对目录条目的更改。文件长度和上次写入日期等元数据属性存储在那里。因此,您将收到两者的通知。ReadDirectoryChangesW() 不会以其他方式区分两者。

这与对同一文件进行多次更改的过程没有什么不同。确保能够处理这两种情况。这通常涉及一个计时器,因此您不会过度使用您在通知上执行的操作数量。这样的计时器也经常需要,因为更改文件的进程仍然有一个锁定,阻止您对文件执行任何操作。直到该进程关闭文件,一段时间后才能确定。

于 2013-04-07T20:29:36.240 回答
2

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

你最好使用ReadDirectoryChangesW文件通知,因为它实际上会告诉你发生了什么变化。

于 2013-04-07T20:15:48.930 回答