ReadDirectoryChangesWを使用して、指定されたディレクトリを監視し、変更が検出されるたびにインデックス構造を更新します。私は複数のファイルを削除するとなぜReadDirectoryChangesWはイベントを省略しますか?
FDirHandle := CreateFile (PChar (FDirectoryWatch.WatchedDirectory),
FILE_LIST_DIRECTORY or GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or
FILE_FLAG_OVERLAPPED, 0);
私は唯一つのイベントを取得します:私は、次のコードは、(おおよそ)
var
InfoPointer : PFileNotifyInformation;
NextOffset : DWORD;
...
while (not Terminated) do begin
if ReadDirectoryChangesW (FDirHandle, FBuffer, FBufferLength, True,
FFilter, @BytesRead, @FOverlap, nil) then
begin
WaitResult := WaitForMultipleObjects (2, @FEventArray, False, INFINITE);
if (WaitResult = waitFileChange) then
begin
InfoPointer := FBuffer;
repeat
NextOffset := InfoPointer.NextEntryOffset;
...
PByte (InfoPointer) := PByte (InfoPointer) + NextOffset;
until NextOffset = 0;
end;
end;
end;
フィルター
FFilter := FILE_NOTIFY_CHANGE_FILE_NAME or
FILE_NOTIFY_CHANGE_DIR_NAME or
FILE_NOTIFY_CHANGE_SIZE or
FILE_NOTIFY_CHANGE_LAST_WRITE;
やディレクトリハンドルであるが、このように得られ、使用しますNextOffsetは0です!ディレクトリを削除すると、そのディレクトリのイベントは1つだけになります。ディレクトリ内のファイルごとに1つのイベントが必要な場合はどうなりますか?
ご協力いただければ幸いです。
遅れて申し訳ありませんが、以前は同期バージョンを使っていましたが、まったく同じ問題がありましたが、スレッドを完全に終了させる方法が見つからなかったため、非同期バージョンに切り替えました。私は、しかし、(WaitForMultipleObjectsへのブロッキング呼び出し、ファイル変更イベントまたは終了イベントのいずれかによって終了することができます)、サンプルコードで重要な行を1つ見逃していました。私はそれに応じて質問を編集する。 (...) – jpfollenius
スナップショットはどういう意味ですか? FindFirstを使用してすべてのファイルを反復処理することを意味する場合、以前はこのようなアプローチを使用していましたが、大きなディレクトリを使用するときの変更検出の遅延が発生しないようにしたい、(2)インデックススレッドのI /その他のI/O操作 – jpfollenius
2番目のコメントに同意しますが、MSDNのドキュメントの状態では、内部バッファのオーバーフローの準備が必要です。この場合、ディレクトリの完全な(再)スキャンが必要です。 – mghie