2016-07-27 5 views
-2

私はStackOverflowなどを検索して、自分のニーズに合ったものは見つけられませんでした。Windowsファイルシステム全体の* all *ファイルの変更に関する通知を受け取るAPI?

私はポーリングのソリューションを望んでいません。それはイベント駆動型であり、リアルタイムで(そのような)すべてのイベントを受信する必要があります。イベントオブジェクトから必要なデータは、変更された(または作成された、または削除された)ファイルのパス/名前だけです。

特定のファイルまたはディレクトリのイベントを受信したくないので、ボリューム全体のイベントを受信したい(「C:」など - ネットワークドライブをサポートする必要はありません)。

理想的には私はJava APIを探していますが、存在しないと思われるので、C/C++にラッパーを書くのはうれしいです。

NB、これはWindowsのコマンドプロンプトまたはWMIでも可能ですが、これも素晴らしいでしょう!

+2

OT on So.ところで、[この興味深い記事](https://lwn.net/Articles/604686/) – LPs

+0

@LPs unforutnatellyを見てください。これはLinuxのみです。 – Shark

+1

@Shark so [this one](https://msdn.microsoft.com/en-us/library/ch2s8yd7(v = versus90).aspx)は役に立ちます。 – LPs

答えて

2

FindFirstChangeNotificationを使用する必要があります。ボリュームのルートを指定し、サブディレクトリへの変更を通知するように指定します。その後、通知ハンドルを待ち、ReadDirectoryChangesで変更を読み取ります。

マイクロソフトからこの例を参照してください:

Obtaining Directory Change Notifications

(注、私が見つかりました。「Windowsファイルウォッチャー」の検索の10秒であること - あなたがしたい場合は、他のリンクの一部が役に立つかもしれません非CまたはC++ソリューション)

+0

うーん、私は "リスナー"、 "オブザーバー"と "モニター"、ウォッチャーではなかった! – barneypitt

+0

そのAPIメソッドは実際にはファイルの変更を監視するのではなく、ディレクトリだけを監視します。実際にどのファイルが変更されたかを実際に判断するには、メモリ内のすべての単一ファイルの最終更新タイムスタンプのマップを維持し、何かが見逃していない限り、ディレクトリのタイムスタンプの各ファイルをメモリ内のファイルと比較する必要があります。実際には実用的ではありません。( – barneypitt

+1

@barneypitt:あなたは 'FindFirstChangeNotification()'ドキュメントでこのステートメントを忘れていました(そして、上記のMartinの答えも同じです): "*この関数はwait条件を満たす変更を示していません。 *通知の一部として特定の変更に関する情報を取得するには、[ReadDirectoryChangesW'](https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465.aspx)機能**を使用します。 * "この関数は、追加/削除/名前変更/変更されたファイルの実際のファイル名を提供します。 –

関連する問題