【问题标题】:Watching folders and subfolders for file changes is not detecting changes监视文件夹和子文件夹的文件更改不会检测到更改
【发布时间】:2025-11-24 03:50:02
【问题描述】:

我想要做的:监视给定文件夹及其所有子文件夹的文件内容是否有任何更改(在 Windows 中,使用 C++)。

我尝试过的:

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>


void WatchFileChanges(char *dir) {

while (true)
{
    HANDLE dwChangeHandles[1];

    dwChangeHandles[0] = FindFirstChangeNotification(
        dir,                         // directory to watch 
        FALSE,                         // do not watch subtree 
        FILE_NOTIFY_CHANGE_LAST_WRITE); // watch file name changes

    auto res = WaitForSingleObject(dwChangeHandles, INFINITE);

    switch (res)
    {
    case WAIT_OBJECT_0: std::cout << "changed" << std::endl; break;
    case WAIT_TIMEOUT: std::cout << "time's up" << std::endl; break;
    }
}
}

int main()
{
    WatchFileChanges("D:/myfolder");
    return 0;
}

我运行上述代码并尝试对文件夹“D:/myfolder”中的文件进行(并保存)更改。但是,我的程序中没有任何反应。根本没有显示任何消息,而我希望显示“已更改”。

我做错了什么?

【问题讨论】:

  • 如果你使用bWatchSubtree: TRUE会发生什么?
  • @Dai 没有任何变化。它仍然没有捕捉到我所做的任何更改。
  • 许多程序从不更改文件。例如,文本编辑器永远不会这样做,这太冒险了。您必须包含 FILE_NOTIFY_CHANGE_FILE_NAME 才能看到它重命名文件。
  • @HansPassant 好的,但我对观察文件名的变化不感兴趣。我有兴趣监视内容被修改的文件。
  • @HansPassant 还有,肯定有其他事情发生。因为为了测试,我只是尝试使用FILE_NOTIFY_CHANGE_FILE_NAME,并更改文件名,但程序仍然没有检测到它。

标签: c++ windows file watch


【解决方案1】:

当我遇到问题时,我会做一些事情。当事情可能出错时,我经常添加写出相关信息的代码;不是在我预计出问题的时候,而是在可能出问题的时候。因此,我测试了您的代码并自动为开关添加了默认值。我的输出是默认情况下的 full 输出,我假设表明 WaitForSingleObject 失败。所以我注意到您在 WaitForSingleObject 中使用 dwChangeHandles[0] 作为 FindFirstChangeNotification 和 dwChangeHandles 的结果。当我将 dwChangeHandles 更改为 dwChangeHandles[0] 时,它对我有用。

有时我们会忽略简单的事情,因为我们认为它会很困难。

【讨论】:

  • 我不得不说是的,我确实尝试了一个默认情况来检查WaitForSingleObject 确实失败了。但是,我从未意识到这可能是原因,因为我假设 dwChangeHandles[0]dwChangeHandles 只是指向同一个内存地址。我很难理解为什么这是问题的解决方案,但你说得非常对:它是!非常感谢!
  • 确实需要时间来适应指针和重定向等等。 dwChangeHandles[0] 的替代品是 *dwChangeHandles