2017-04-24 9 views
0

私がしたいこと:指定されたフォルダとすべてのサブフォルダのファイル内容の変更(WindowsではC++を使用)を監視します。私が試してみました何ファイル変更のフォルダとサブフォルダを監視しても変更が検出されない

:「:/ myfolderなどD」

#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; 
} 

を私は上記のコードを実行し、作る(および保存)してみてください、フォルダ内に置くファイルに変更されます。しかし、私のプログラムでは何も起こりません。メッセージは表示されず、「変更されました」と表示されます。

私は間違っていますか?

+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

関連する問題