【发布时间】:2012-12-11 18:24:58
【问题描述】:
我尝试了解 ReadDirectoryChangesW 功能,以便我可以有效地了解多个目录中的内容更改(文件被覆盖、文件删除、重命名等)。
我最近的一个观察是,对于每个文件写入操作,我总是会收到单个文件的两个通知。
我非常仔细地追踪了这一点,并且我确信,如果我覆盖了一个文件(比如一个带有新内容的 .txt 文件 - 基本上里面有几个额外的字母),ReadDirectoryChangesW() 会在每个文件保存时通知我两次.
这是一件严肃的事情,因为我希望每次更改只会收到一次通知。我不希望无意中重复在我的应用程序中应该只发生一次的操作。
这种行为已知吗?请问有没有办法每次更改只接收一个通知?有没有办法有效地避免双重通知?
我使用:
- 非托管 C++
- Visual Studio 2012
- Windows 7 x64
我使用非常基本的代码来做我的测试,但你会想看看它,所以这里是:
HANDLE hDir = CreateFile(
lpDir,
FILE_LIST_DIRECTORY,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
int nCounter = 0;
FILE_NOTIFY_INFORMATION strFileNotifyInfo[1024];
DWORD dwBytesReturned = 0;
while(TRUE)
{
if( ReadDirectoryChangesW ( hDir, (LPVOID)&strFileNotifyInfo, sizeof(strFileNotifyInfo), FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE, &dwBytesReturned, NULL, NULL) == 0)
{
ErrorCheck(_T("Reading Directory Change"));
}
else
{
_tcout << _T("File Modified: ") << strFileNotifyInfo[0].FileName << endl;
_tcout << _T("Loop: ") << nCounter++ << endl;
}
}
【问题讨论】:
-
首先你说每个写操作,但是你的例子是覆盖。我推测从目录的角度来看,覆盖可能涉及多个操作(例如删除然后创建),而不仅仅是写入/附加到现有文件。但我对此没有任何权威参考...
-
@TheUndeadFish,嗨,谢谢你的想法。它确实非常聪明。我用另一个标志尝试了我的测试。我可以说,例如 FILE_NOTIFY_CHANGE_ATTRIBUTES 也会返回两个通知。这可以解释为,在文件覆盖时,通常会更改多个属性?
标签: c++ windows winapi visual-c++ file-io