2017-04-24 80 views
0

我想做什么:监视给定文件夹及其所有子文件夹中文件内容(在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文件”。但是,我的程序中没有任何反应。根本没有显示任何消息,但我希望显示“更改”。

我在做什么错?

+0

如果使用'bWatchSubtree:TRUE',会发生什么? – Dai

+0

@Dai没有什么变化。它仍然没有抓住我所做的任何改变。 – Juddy

+0

许多程序永远不会更改文件。例如,一个文本编辑器从来没有这样做,它太冒险了。您必须包含FILE_NOTIFY_CHANGE_FILE_NAME以查看重命名文件。 –

回答

0

当我遇到问题时,我会做某些事情。我经常添加写出相关信息的代码,当事情可能出错;不是当我期望出现问题时,但当可能出问题了。所以我测试了你的代码,我自动给交换机增加了一个默认值。我的输出是完整输出来自默认情况,我假设指示WaitForSingleObject失败。所以我注意到你在WaitForSingleObject中使用FindFirstChangeNotification和dwChangeHandles的结果使用dwChangeHandles [0]。当我将dwChangeHandles改为dwChangeHandles [0]时,它对我很有用。

有时我们会忽略简单因为我们期望它很难。

+0

我不得不说,是的,我确实尝试了一个默认情况来检查'WaitForSingleObject'确实失败。然而,我从来没有意识到这可能是原因,因为我认为'dwChangeHandles [0]'和'dwChangeHandles'只是指向相同的内存地址。它使我难以理解为什么这是问题的解决方案,但你是非常正确的:它是!非常感谢! – Juddy

+0

确实需要时间才能熟悉指针和重定向等等。 'dwChangeHandles [0]'的替代方法是'* dwChangeHandles'。 – user34660