問題タブ [readdirectorychangesw]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
65 参照

c++ - ReadDirectoryChanges バッファー配置の問題エラー 998 Windows

システム上のファイルの変更を監視する次のコードがありますが、エラー コード 998 (INVALID MEMORY LOCATION) が表示されます。私のコードの何が問題なのですか? バッファの配置に問題があるはずですが、コーディングの間違いを見つけることができませんか?

システムの変更を監視するために使用するコードを以下に示します。

私の間違いについてアドバイスしてください

0 投票する
1 に答える
131 参照

c - ReadDirectoryChangesW が最後の書き込みイベントを報告しない

ReadDirectoryChangesW()監視する必要があるフォルダーの作業を行うことができました。私は IO Completion ルーチンを使用していますが、すべての変更監視は、変更とシグナルの停止以外は何もしないスレッドによって行われます。それはすべてうまくいきます。完了ルーチンは現在、変更されたファイル名とアクションを通知レコードからシステム デバッグ ログに記録しているだけです。繰り返しますが、うまく機能しているようです。テスト中、利用可能なすべてのイベント (0x017F のマスク) を待機しています。

私の質問は、メモ帳などで変更されたファイルを保存するときに、LAST WRITE 変更イベントが表示されないのはなぜですか?

私はもともと FILE_NOTIFY_CHANGE_CREATION、_LAST_WRITE、および _FILE_NAME イベントのみを待機していましたが、なぜ最後の書き込みイベントが表示されなかったのか疑問に思いました (ただし、待機していなかった _DIR_NAME イベントは表示されました)。そのため、すべてを待機するように変更しました。

私のコードは現在、例としてここで見つけたものと非常によく似ています: ReadDirectoryChangesW

デバッグ中に、FindFirstFile()監視対象のファイルを変更する前後に WIN32_FIND_DATA のコピーを取得して、最終書き込み時刻が変更されたことを確認していました。では、なぜ通知がないのでしょうか。それを可能にするために何か特別なことをする必要がありますか?

0 投票する
1 に答える
432 参照

c++ - ReadDirectoryChangesW は、単一のイベントのみを FILE_NOTIFY_INFORMATION バッファーに配置します

ReadDirectoryChangesWイベントが欠落し続けるという問題があります。

私は多くのグーグル検索を行い、次の関数の引数は私の検索によると正しいようですが、誰も確実に知りません. こんな感じで見始めます。

_ovl.hEvent以上で、ご利用お待ちしておりWaitForMultipleObjectsます。監視スレッドに終了を指示するイベントも常にあるため、複数のオブジェクトを使用します。

ovl.hEventが通知された場合、私はこれを行います:

この時点で、常に 0 であるとは限らないことに注意してください。ファイルの名前を変更すると、新しいファイル名用と古いファイル名用のinfo->NextEntryOffset2 つのエントリが正しく取得されます。_resultData

イベントごとに複数のファイルが変更されることは決してありません。これは問題です。コード全体は次のようになります (疑似コード)

これで、配列を処理するReadDirectoryChangesW にリクエストを再開したことがわかります。MyFileInfoStructしかし問題は、2 つ以上のファイルがコピーされた場合、前のファイルを処理している間に 2 番目のファイルがイベントによって登録されますが、最後の変更を「取得」してイベントを再開するまで、後続の変更は無視されます。

2 番目のスレッドで FILE_CHANGES部分からすべての情報を処理することで、これを部分的に解決できます。ただし、開始リクエスト全体を作成することで、イベントを見逃す可能性を減らすだけです->待機->ピックアップ->イベントルーチンの再起動を少し高速にします。ReadDirectoryChangesW実際には 100% のカバレッジを提供するわけではありません。リクエストが保留されていない瞬間がまだあります。

私はインターネットで多くのことを読んでいて、2つの解決策が頻繁に言及されていることを発見しました:

  • ファイルの変更を処理するために別のスレッドを使用します(私はすでにそれを行いました)
  • のサイズを大きくしFILE_NOTIFY_INFORMATION[]ます。これは私にはうまくいきません.Windowsはそこに1つのイベントしか入れません

したがって、問題は次のとおりです。呼び出して結果を「取得」するまで、ファイルの変更を取得してバッファReadDirectoryChangesWGetOverlappedResult追加し続けるにはどうすればよいですか? これは可能ですか?複数の結果を1つのバッファに入れることができた人はいますか?FILE_NOTIFY_INFORMATION[]GetOverlappedResult