【发布时间】: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,并更改文件名,但程序仍然没有检测到它。