ReadDirectoryChangesW
いくつかのディレクトリのコンテンツの変更 (ファイルの上書き、ファイルの削除、名前の変更など) について効果的に通知できるように、機能を理解しようとしています。
私の最近の観察の 1 つは、すべてのファイル書き込み操作に対して、単一のファイルに対して常に 2 つの通知を受け取ることです。
私はそれを非常に注意深く追跡しましたが、ファイルを上書きすると(たとえば、新しいコンテンツを含む.txtファイル-基本的に余分な文字がいくつか含まれています)、ReadDirectoryChangesW()
そのファイルの保存ごとに2回通知されると確信しています.
変更ごとに一度だけ通知されることを期待しているので、これは深刻なことです。アプリケーションで 1 回だけ実行する必要がある操作を意図せずに繰り返したくありません。
この動作は既知ですか? 1 回の変更につき 1 回だけ通知を受け取る方法はありますか? 二重通知を効果的に回避する方法はありますか?
私が使う:
- アンマネージ C++
- ビジュアル スタジオ 2012
- ウィンドウズ 7 x64
私は非常に基本的なコードを使用してテストを行っていますが、見たいと思うので、ここに示します。
HANDLE hDir = CreateFile(
lpDir,
FILE_LIST_DIRECTORY,
FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL);
int nCounter = 0;
FILE_NOTIFY_INFORMATION strFileNotifyInfo[1024];
DWORD dwBytesReturned = 0;
while(TRUE)
{
if( ReadDirectoryChangesW ( hDir, (LPVOID)&strFileNotifyInfo, sizeof(strFileNotifyInfo), FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE, &dwBytesReturned, NULL, NULL) == 0)
{
ErrorCheck(_T("Reading Directory Change"));
}
else
{
_tcout << _T("File Modified: ") << strFileNotifyInfo[0].FileName << endl;
_tcout << _T("Loop: ") << nCounter++ << endl;
}
}