Discussion:
フォルダ内のファイル更新監視について
(too old to reply)
Slims
2008-09-08 12:24:01 UTC
Permalink
あるフォルダにあるファイルの変更通知を受け取るために以下のAPIを使用して、ファイルの最終更新日時が変更されたら待機関数から抜け、再度、監視を続けるプログラムを書いたところ、一度のファイル更新で必ず変更通知が二回通知されます。
何か注意するところがあればご教授ください。
1.FindFirstChangeNotification(
 Path, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE)
2.WaitForMultipleObjectsEx()
3.FindNextChangeNotification()
※2~3の繰り返し
UETA, Shin-ichi
2008-09-11 04:11:24 UTC
Permalink
こんにちは、植田です。解決にはならないかもしれませんが ――
Post by Slims
一度のファイル更新で必ず変更通知が二回通知されます。
とりあえず、以下のコードで現象を再現できました。要するに、
fwrite()とfclose()のそれぞれで通知が発行されているのでは
ないかと推測できます。
この条件とは異なるのに通知が重複しているということなら、
現象を再現可能な最低限のコードを示した方がいいでしょう。

HANDLE handle = ::FindFirstChangeNotification(".", FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE);

FILE* f = fopen("test.txt", "w");

fwrite("test", 4, 1, f);

// fclose(f); // ここで閉じると通知は2回

switch (::WaitForSingleObject(handle, 100)) {
case WAIT_OBJECT_0:
::OutputDebugString("OK\n");
break;
case WAIT_TIMEOUT:
::OutputDebugString("Timed out\n");
break;
}
::FindNextChangeNotification(handle);

switch (::WaitForSingleObject(handle, 100)) {
case WAIT_OBJECT_0:
::OutputDebugString("What's happened?\n");
break;
case WAIT_TIMEOUT:
::OutputDebugString("OK\n");
break;
}
switch (::WaitForSingleObject(handle, 100)) {
case WAIT_OBJECT_0:
::OutputDebugString("What's happened?\n");
break;
case WAIT_TIMEOUT:
::OutputDebugString("OK\n");
break;
}
::CloseHandle(handle);

fclose(f); // ここで閉じると通知は1回
--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:***@usdesign.jp
Slims
2008-09-15 12:12:01 UTC
Permalink
To:植田さん

お礼が遅くなってすみません。
植田さんの推測通りの動きになっているようです。
ドキュメントを単純に鵜呑みにしていました。

コードの提示については確かにそうですね<反省。

いろいろとありがとうございました。

Loading...