2

GetQueuedCompletionStatusと組み合わせてReadDirectoryChangesW(Windows API)を非同期的に使用しています。バッファオーバーフローの可能性を検出して、少なくとも1つのファイルシステム変更イベントが失われたことを理解するにはどうすればよいですか?

4

3 に答える 3

2

非同期で使用ReadDirectoryChangesWする場合は、イベントの最初のグループを取得し、さらにイベントを取得するには、それを再度呼び出す必要があります。バッファに収まらないほど多くのイベントがあることはエラーではありません。OSレベルのバッファに収まらないほど多くのイベントがあることがエラー状態であり、次のようになります。

  1. 何らかのイベントが発生します。
  2. によって開始された非同期操作がReadDirectoryChangesW正常に完了します。バッファがいっぱいになるか、イベントハンドルが設定されるか、IOCPがトリガーされます。
  3. 追加のイベントが発生し、OSレベルのバッファに保存されます。
  4. さらに追加のイベントが発生し、OSレベルのバッファがオーバーフローします。これは、ステップ2ですでに成功しているオーバーラップ操作のステータスを変更しません。
  5. イベントハンドルを待つか、IOCPを処理して、完了したOVERLAPPED呼び出しを検出します。
  6. ReadDirectoryChangesWもう一度呼び出して、手順2以降に発生したイベントをチェックする非同期オーバーラップ操作を開始します。 この呼び出しは、と同期して失敗GetLastError() == ERROR_NOTIFY_ENUM_DIRするか、で成功します。これはdwBytesTransferred == 0ドキュメントにディレクトリの再列挙も意味すると記載されているためです。

転送されたバイト数がゼロの場合、バッファが大きすぎてシステムが割り当てることができないか、小さすぎてディレクトリまたはサブツリーで発生したすべての変更に関する詳細情報を提供できませんでした。この場合、ディレクトリまたはサブツリーを列挙して変更を計算する必要があります。

于 2017-07-22T23:49:13.967 に答える
1

その方法では検出を実行できない場合がありますが、ここに役立つ可能性のある優れたチュートリアルがあります。

この他の質問への回答も確認してください。

于 2011-12-13T02:40:56.903 に答える
0

ここから判断すると、非同期で返されるようなエラーコードはないようです。

提案:変更を同期的に監視しますが、専用のスレッドで監視し、に注意してERROR_NOTIFY_ENUM_DIRください。

于 2011-12-12T09:37:29.903 に答える