- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我尝试了解 ReadDirectoryChangesW
函数,以便我可以有效地了解多个目录中的内容更改(文件被覆盖、文件删除、重命名等)。
我最近的观察之一是,对于每个文件写入操作,我总是会收到单个文件的两个通知。
我非常仔细地追踪了这一点,并且我确信,如果我覆盖了一个文件(比如一个带有新内容的 .txt 文件 - 基本上里面有几个额外的字母),ReadDirectoryChangesW()
会通知我每个文件保存两次。
这是一件严肃的事情,因为我希望每次更改只会收到一次通知。我不希望无意中重复在我的应用程序中应该只发生一次的操作。
这种行为已知吗?请问有没有办法每次更改只接收一个通知?有没有办法有效地避免双重通知?
我使用:
我使用非常基本的代码来做我的测试,但你会想看看它,所以这里是:
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;
}
}
最佳答案
ReadDirectoryChangesW() 对文件系统的看法非常短视。它会看到文件系统的每一个更改,并尽职尽责地报告它们。是的,当您写入文件时,通常会有不止一个。它是您正在使用的特定文件系统的实现细节,但 Windows 中的任何常见文件系统也为存储文件元数据的文件保留目录条目。
所以你看到了文件数据的写入。但是您也看到它改变了目录条目。特别是文件大小,可能会在您写入文件并向文件添加数据时发生变化。以及记录在目录条目中的最后写入和最后访问时间戳。否则,api 对所做的更改视而不见,它只看到低级写入。它也完全不知道什么特定的进程要求写入。
这是你必须处理的事情,没有办法区分这些写入。您所知道的只是“文件已更改”。完全无法发现如何、为什么、由谁以及多久发现一次。
您必须处理的其他事情是,在生成通知时,写入文件的进程很可能仍然对文件有锁定。这会阻止您自己对文件做任何有用的事情。像读取文件或复制它很可能会失败。您必须等待,直到处理完文件并关闭文件句柄。除了尝试自己打开文件并拒绝任何共享之外,没有办法发现这一点。这需要一个计时器,定期尝试自己获取文件的锁定。设置好管道后,获得多个文件的更改通知就不再重要了。
关于C++ WinApi : ReadDirectoryChangesW() Receiving Double Notifications,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14036449/
我想知道特定目录的任何更改文件。所以,我想出了 ReadDirectoryChangesW() 和 FindFirstChangeNotification() - FindNextChangeNoti
最初我被链接到这个调用,这样我就可以记录对某个文件的所有访问并捕获对其的所有更改。 我已经完成了几个例子,但都失败了。甚至是msdn代码无法为我编译。 有人可以为我提供一个小的工作片段来监视文件并记录
我已经设法让 ReadDirectoryChangesW() 为我需要监视的文件夹工作。我正在使用 IO 完成例程,所有更改监视都是由一个线程完成的,该线程除了等待更改和停止信号外什么都不做。一切都很
我想监控指定目录下的修改,获取准确的修改信息。所以我决定使用 ReadDirectoryChangesW()功能。但我想异步使用它,这意味着如果目录中没有更改,我不希望我的工作线程被阻塞。 我该怎么做
简介: 我正在尝试使用 ReadDirectoryChangesW 在一个循环中异步。 下面的片段说明了我正在努力实现的目标: DWORD example() { DWORD error =
我正在使用 ReadDirectoryChangesW基于此 question 异步观察目录更改我实现了一个监视给定目录的函数,但我仍然收到错误消息 GetQueuedCompletionStatus
我使用下一个代码来了解某个文件夹中的文件何时更改: HANDLE hDir = ::CreateFile(path, FILE_LIST_DIRECTORY, FILE_SHARE_READ|FILE
我一直在尝试让 ReadDirectoryChangesW 监视子树的文件更改,但我发现我得到的结果不一致。以下是说明问题的自包含测试用例。当我运行它时,它有时会产生: A : Created C :
我已经阅读了 ReadDirectoryChangesW() 的文档,还看到了 CDirectoryChangeWatcher project ,但都没有说明为什么人们想要异步调用它。我知道 curr
我想递归地观察目录中的所有变化,即如果观察 C:\ 我想接收通知 C:\1.txt C:\A\1.txt 如果我使用启用了 watchSubtree 选项的 ReadDirectoryChanges,
我正在使用 GetQueuedCompletionStatusEx() 和 ReadDirectoryChangesW() 尝试接收对多个文件系统层次结构的更改通知。 我注意到当一次有很多更改时,我会
我正在尝试使用 ReadDirectoryChangesW API 使用 python 在 Windows 上查看目录以创建/删除/重命名更改。这是我的代码,它运行良好: results = win3
我将 ReadDirectoryChangesW (Windows API) 与 GetQueuedCompletionStatus 结合使用。如何检测可能的缓冲区溢出以了解至少一个文件系统更改事件已
我有一个应用程序必须监视特定目录中的任何更改。我使用以下代码,但是当我重命名文件时,不会触发操作 FILE_ACTION_RENAMED_NEW_NAME。实际上,触发了 UNDISCOVERED A
我正在尝试使用 ReadDirectoryChangesW 来跟踪文件创建、复制或移动到受监控目录的时间。 我的问题是,当我在受监控的目录上复制或创建文件时,ReadDirectoryChangesW
使用 ReadDirectoryChangesW 监视文件夹会导致其父级被锁定且无法删除。 这里有一篇关于这个的帖子: FindFirstChangeNotification locks parent
这是名为 JNotify 的开源项目的一部分。我正在尝试修复 Win32 实现,这真的让我抓狂。我已经阅读了 MSDN 中关于此的所有内容,并阅读了有关此糟糕 API 的所有网络帖子。我正在尝试使用完
我这样做对吗? 我正在尝试查找在名为 C:\Perl 的文件夹中发生的所有更改 在 ReadDirectoryChangesW 之后,它就卡在那里了。它没有前进。我是否遗漏了一些明显的东西? 我正在努
我调用 ReadDirectoryChangesW异步监视后台线程中的目录更改。 这是如何打开目录 ( basePath) 并启动“读取”线程的: m_hDIR = CreateFileW(
我想在一个线程中实时监控几个目录的变化,所以我决定使用与GetQueuedCompletionStatus异步的ReadDirectoryChangesW()方法。这是我的代码: static DWO
我是一名优秀的程序员,十分优秀!