GetQueuedCompletionStatusと組み合わせてReadDirectoryChangesW(Windows API)を非同期的に使用しています。バッファオーバーフローの可能性を検出して、少なくとも1つのファイルシステム変更イベントが失われたことを理解するにはどうすればよいですか?
1087 次
3 に答える
2
非同期で使用ReadDirectoryChangesW
する場合は、イベントの最初のグループを取得し、さらにイベントを取得するには、それを再度呼び出す必要があります。バッファに収まらないほど多くのイベントがあることはエラーではありません。OSレベルのバッファに収まらないほど多くのイベントがあることがエラー状態であり、次のようになります。
- 何らかのイベントが発生します。
- によって開始された非同期操作が
ReadDirectoryChangesW
正常に完了します。バッファがいっぱいになるか、イベントハンドルが設定されるか、IOCPがトリガーされます。 - 追加のイベントが発生し、OSレベルのバッファに保存されます。
- さらに追加のイベントが発生し、OSレベルのバッファがオーバーフローします。これは、ステップ2ですでに成功しているオーバーラップ操作のステータスを変更しません。
- イベントハンドルを待つか、IOCPを処理して、完了したOVERLAPPED呼び出しを検出します。
ReadDirectoryChangesW
もう一度呼び出して、手順2以降に発生したイベントをチェックする非同期オーバーラップ操作を開始します。 この呼び出しは、と同期して失敗GetLastError() == ERROR_NOTIFY_ENUM_DIR
するか、で成功します。これはdwBytesTransferred == 0
、ドキュメントにディレクトリの再列挙も意味すると記載されているためです。
転送されたバイト数がゼロの場合、バッファが大きすぎてシステムが割り当てることができないか、小さすぎてディレクトリまたはサブツリーで発生したすべての変更に関する詳細情報を提供できませんでした。この場合、ディレクトリまたはサブツリーを列挙して変更を計算する必要があります。
于 2017-07-22T23:49:13.967 に答える
0
ここから判断すると、非同期で返されるようなエラーコードはないようです。
提案:変更を同期的に監視しますが、専用のスレッドで監視し、に注意してERROR_NOTIFY_ENUM_DIR
ください。
于 2011-12-12T09:37:29.903 に答える