本文介绍了ReadDirectoryChangesW双重通知的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试一个正在收听文件夹的简单应用程序,并且每次创建新文件,移动或复制到该文件夹​​时我都想收到通知。

所以我创建了一个简单的应用程序,创建一个单独的线程,我调用 ReadDirectoryChangesW

为了无限地执行此操作,我已经完成了一个while(true)循环。



代码非常简单(我在同步模式下使用ReadDirectoryChangesW)

I'm trying to cerate an simple application that is listening to a folder, and everytime a new file is created, moved or copyed to that folder i want to get a notification.
So i created a simple application that creates a seperate thread where i call ReadDirectoryChangesW.
To do this infinitely i have done it into a while(true) loop.

The code is pretty simple (i use ReadDirectoryChangesW in synchronus mode)

while(TRUE)
{
	BYTE						byBuffer[32 * 1024]; // 32 kB
	DWORD						dwOffset = 0;
	TCHAR						cFile[MAX_PATH];
	DWORD						dwBytesRet;
	PFILE_NOTIFY_INFORMATION	pNotify;

	ReadDirectoryChangesW(pWatcher->m_hDir, byBuffer, sizeof(byBuffer), 0, pWatcher->m_dwNotifyFilter, &dwBytesRet, NULL, NULL);

	do
	{
		pNotify = (PFILE_NOTIFY_INFORMATION) &byBuffer[dwOffset];
		dwOffset += pNotify->NextEntryOffset;

		INT nCount = WideCharToMultiByte(CP_ACP, 0, pNotify->FileName, pNotify->FileNameLength / sizeof(WCHAR), cFile, MAX_PATH - 1, NULL, NULL);
		cFile[nCount] = TEXT('\0');

		// Notify me
	}
	while(pNotify->NextEntryOffset != 0);
}





现在的问题是,对于每个新创建的文件,我都会收到两个通知。



按以下顺序执行:



The problem is now, that for every new created file i get two notifications.

It do it in the following order:



  1. ReadDirectoryChangesW 使用新创建的文件返回
  2. 进入do-while循环
  3. 获取 pNotify -pointer
  4. 计算偏移量
  5. 将缓冲区复制到TCHAR阵列
  6. 通知我
  7. 到目前为止一切正常


  1. ReadDirectoryChangesW returns with the new created file
  2. move into the do-while loop
  3. get the pNotify-pointer
  4. calculate the offset
  5. Copy the buffer into a TCHAR-array
  6. Notify me
  7. up to this point everything is ok





我在互联网上搜索过,发现这看起来像是一个常见的bug。所以我试图用第二个字符串解决bug。我将第二个字符串与存储在cFile []中的字符串进行比较,如果它们不同,我将cFile保存到我的第二个字符串并通知。

如果一次只创建一个文件,那么工作没问题。但是,如果我复制一个文件包(例如4),解决方案将无法正常工作,因为文件没有排序(如果我说订购我的意思是文件1,文件1,文件2,文件2,...它们更像文件1,文件2,文件3,文件4,文件3,文件1,文件4)。



所以我希望来自CodeProject的人们能够帮我;有没有可用的(和漂亮的)解决这个问题的解决方案?



我很高兴听到你的一些解决方案或想法!

提前非常感谢!

推荐答案


这篇关于ReadDirectoryChangesW双重通知的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-09 22:09