问题描述
我正在尝试一个正在收听文件夹的简单应用程序,并且每次创建新文件,移动或复制到该文件夹时我都想收到通知。
所以我创建了一个简单的应用程序,创建一个单独的线程,我调用 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:
-
ReadDirectoryChangesW
使用新创建的文件返回 - 进入do-while循环
- 获取
pNotify
-pointer - 计算偏移量
- 将缓冲区复制到TCHAR阵列
- 通知我
到目前为止一切正常
ReadDirectoryChangesW
returns with the new created file- move into the do-while loop
- get the
pNotify
-pointer - calculate the offset
- Copy the buffer into a TCHAR-array
- Notify me
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双重通知的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!