問題タブ [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.
.net - ReadDirectoryChangesW でファイルの変更が失われないようにする方法
多くのファイル アクティビティがある場合に、ReadDirectoryChangesW API 関数でファイルが見つからないという投稿がインターネット上に多数あります。ほとんどの人は、ReadDirectoryChangesW 関数ループが呼び出される速度を非難します。これは間違った仮定です。私が見た最良の説明は、次の投稿、2008 年 4 月 14 日月曜日の午後 2:15:27 のコメントにあります。
http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/4465cafb-f4ed-434f-89d8-c85ced6ffaa8/
要約すると、ReadDirectoryChangesW 関数は、ファイルの変更が追加されたときではなく、ファイル後書きキューを離れるときにファイルの変更を報告します。また、コミットする前にあまりにも多くのものが追加されると、そのうちのいくつかに気が付かなくなります。ディレクトリに1000以上のファイルを生成するプログラムを作成するだけで、実装でこれを確認できます。受け取ったファイル イベント通知の数を数えてみると、すべてを受信できない場合があることがわかります。
問題は、毎回ボリュームをフラッシュせずに ReadDirectoryChangesW 関数を使用する信頼できる方法を見つけた人はいますか? ユーザーが管理者でない場合、これは許可されず、完了までに時間がかかる場合もあります。
c++ - ReadDirectoryChangesW の代わりに FindFirstChangeNotification と FindNextChangeNofication を使用して、指定したディレクトリ内のファイル情報の変更を取得できますか?
指定したディレクトリのファイルまたはサブディレクトリに変更があった場合に通知を受け取りたい。次の単純なコード セグメントで関数を実現します。
を使用せずにアクションタイプやファイル名などの情報を取得するにはどうすればよいReadDirectoryChangesW
ですか?
windows - 完了ルーチンで ReadDirectoryChangesW() メソッドを使用するには?
ReadDirectoryChangesW()
I /O 完了ルーチンが提供されている非同期モードで関数を使用したい。
CALLBACK
問題は、完了ルーチン (関数)の変更に関する正確な情報を取得する方法がわからないことです。完了ルーチンは次のように定義されます。
情報が構造に含まれているのだろうかLPOVERLAPPED
。しかし、私はそれを取得する方法がわかりません。
c++ - ReadDirectoryChangesW を非同期で使用するとスレッドがデッドロックする
1 つのスレッドで複数のディレクトリの変更をリアルタイムで監視したいので、GetQueuedCompletionStatus と非同期で ReadDirectoryChangesW() メソッドを使用することにしました。これが私のコードです:
ここでコードを実行すると、GetQueuedCompletionStatus() 関数の最後のパラメーターに設定した値に関係なく、理由もなくスレッドがブロックされます。なぜこの問題に遭遇したのかわかりません。誰でも理由を教えてもらえますか? どうもありがとう!
c++ - ReadDirectoryChangesW が変更されたファイルを取得しないのはなぜですか?
私は本当に愚かなことをしていて、それを見ていないと確信していますが、次のコードが渡されたディレクトリの変更を取得しない理由を誰か教えてもらえますか?
このコードを呼び出すと、m_directory で渡されたファイルまたはディレクトリの作成および変更は無視されます。でも電話したら
その後、GetQueuedCompletionStatus は正しく終了します。誰かが私が間違っていることを見ていますか? コードは次のとおりです。
編集:
わかりました、確かに ReadDirectoryChangesW() が TRUE を返していると思いましたが、そうではありません。GetLastError() は、エラーが ERROR_INVALID_HANDLE (6) であることを教えてくれます。奇妙なことは、logDirHandle が有効であるように見え、CreateFile() の呼び出しでエラーが発生しなかったことです。
また、同期の ReadDirectoryChangesW を呼び出すように少しリファクタリングして、OVERLAPPED のものを失うことを除いてすべてを同じに保ち、正常に機能しました。だから私は OVERLAPPED のものを間違って実装していると思いますか?
winapi - ファイルのコピーが終了したことを知る方法
ReadDirectoryChangesWを使用してフォルダーをスパイしています。大きなファイルをフォルダーにコピーしている場合、複数のFILE_ACTION_MODIFIEDメッセージを受信できます。ウィンドウがファイルの大きなチャンクを書き込むたびに、それぞれのファイル変更通知を受け取るようです。時間。CreateFile APIを使用して、ファイルをAPで開くことができるかどうかを確認しようとしましたが、一部のファイルは常に他のAPによってロックされています。たとえば、Outlookを開いている場合、PSTは更新されますが、APは更新できます。アクセスしないでください。シャドウコピーを開始して開く必要があります。だから私の質問は、ファイルがコピーを終了したことを知る方法ですか?
windows - ReadDirectoryChangesW がイベントを省略するのはなぜですか?
ReadDirectoryChangesW を使用して、指定されたディレクトリを監視し、変更が検出されるたびにインデックス構造を更新します。次のコードを使用します(大まかに)
フィルターは
ディレクトリハンドルは次のように取得されます。
複数のファイルを削除すると、イベントが 1 つしか発生せず、NextOffset は 0 です! また、ディレクトリを削除すると、そのディレクトリのイベントが 1 つだけ取得されます。ディレクトリ内のファイルごとに 1 つのイベントが必要な場合はどうすればよいですか?
どんな助けでも大歓迎です。
windows - ReadDirectoryChangesW を非同期で使用する理由
私はドキュメントを読み、プロジェクトReadDirectoryChangesW()
も見ましたが、なぜそれを非同期で呼び出したいのかはどちらも言いません。現在のスレッドがブロックされないことは理解していますが、少なくとも完了ポートを使用する CDirectoryChangeWatcher コードについては、 を呼び出すと、そのスレッドはブロックされます (変更がない場合)。CDirectoryChangeWatcher
GetQueuedCompletionStatus()
したがってReadDirectoryChangesW()
、最初に別のスレッドで同期的に呼び出すと、それがブロックされても気にしないのに、なぜReadDirectoryChangesW()
非同期で呼び出す必要があるのでしょうか?
c++ - ReadDirectoryChangesW は、ショートカットが作成直後に削除されていると考えています
このReadDirectoryChangesW の実装を使用して、デスクトップへの変更を監視しています。私のプログラムは、デスクトップにファイルが作成されたときにいくつかの小さなプログラムを実行する予定です。
今私が直面している問題は、右クリックのコンテキスト メニュー ReadDirectoryChangesW を使用して新しいショートカットを作成すると、ファイルが作成されたという通知が表示されますが、ファイルが削除されたという別の通知が表示された直後です。Windows Vista 以来、この問題に遭遇しています。
何が間違っているのか誰にも分かりますか?Vista および 7 に固有のディレクトリ変更を監視するために使用すべき別の機能はありますか?
ありがとう、クリシュナ
java - ReadDirectoryChangesW用に開かれたディレクトリの最終変更時刻を設定する
ディレクトリツリーの変更を監視する必要のあるJavaプログラムがあります。を使用するJNIコードがありますReadDirectoryChangesW()
。ディレクトリは次のように開かれます。
そして、私はに渡しdirHandle
ますReadDirectoryChangesW()
。それはすべてうまく機能します。
問題は、コードの他の部分(Java側)がFile.setLastModified()
ファイルまたはディレクトリに「タッチ」するために使用することです(タイムスタンプを「今」に更新します)。これは一般的に機能します。ただし、を使用して開いたディレクトリに「タッチ」しようとすると失敗しますCreateFile()
。
実際に発生しているWindowsエラーを確認するために、JDKソースを調べて、File.setLastModified()
エラーを出力することを追加して、独自のコードで再実装しましたGetLastError()
。エラーは次のとおりです。
WTF?同じプロセスです。私も合格FILE_SHARE_READ
しFILE_SHARE_WRITE
ましたCreateFile()
。
これを機能させる方法はありますか?
より詳しい情報
File.setLastModified()
JDKでのネイティブコードの実装は次のことを行います。
0
最初のをに変更するとFILE_SHARE_READ | FILE_SHARE_WRITE
、すべて機能します。したがって、JDKの実装は少し壊れているようです。:(
したがって、私の質問は次のようになります。私自身の(再)実装を使用せずにこの作業を行う方法はありFile.setLastModified()
ますか?