C/C++ でファイル/ディレクトリの変更の通知を受け取る方法 (理想的には POSIX を使用)
質問
この件名がすべてを物語っています。通常、簡単でクロスプラットフォームな方法は、インテリジェントにポーリングすることです。ただし、どの OS にもポーリングせずに通知する手段がいくつかあります。合理的なクロスプラットフォームの方法でそれは可能ですか?(私は Windows と Linux しか気にしていませんが、Mac を使用しているので、posix が役に立つかもしれないと思いました?)
解決
Linux ユーザーが使用できるのは 通知する
Inotifyは、ファイルシステムイベント通知を提供するLinuxカーネルサブシステムです。
Windows 愛好家向けの特典:
- ファイル変更通知 MSDN で
- "フォルダーが変更されたとき" 記事
- ファイルシステム変更通知
他のヒント
Qtライブラリには、 QFileSystemWatcher ファイルが変更されたときにクロスプラットフォーム通知を提供するクラス。Qt を使用していない場合でも、ソースが入手可能なので、独自の実装のサンプルとして参照することができます。Qt には Windows、Linux、Mac 用に個別の実装があります。
あるよ ファイル システム イベント API レオパルドのように。
POSIX 自体にはそのための機能がないと思います。私が見た中で最もクロスプラットフォームに近いのは ファム, 、これは Linux、BSD、Irix では動作するようですが、Windows や MacOS に移植するのがどれほど簡単かはわかりません。
実際、私は商用 C++ コード ベースで使用するために、以前にこのシステムを構築したことがあります。実際にすべての奇妙なものを必要としない限り、Windows と POSIX システムには抽象化できる重複部分がたくさんあります。
POSIX:inotify を使用します。これは文字通りこのジョブのために構築されたシステム全体です
ウィンドウズ:「変更イベント」を使用します。より多くの接着剤とレポートを自分で構築する必要があります (必要な API はすべて利用可能ですが、inotify が提供するワンストップ ショッピングはありません)。
イベントを転送するための「通知スレッド」で検出できる一般的なものは次のとおりです。
1) 基本的に、権限の変更を除き、あらゆる侵襲的な操作 boost::filesystem がサポートされます。これは、フォルダーやファイルの移動、作成、削除、コピーなどです。
2) ファイルの読み取りと書き込み (特にと書いています)。非同期 I/O を使用している場合、通知が順序どおりに表示されない可能性があることに注意してください。
3) 新しいボリュームが追加されたとき (誰かがフラッシュ ドライブを接続したときなど)。
特に inotify は非常識なレベルのきめ細かい制御を提供しますが、Windows はそれほどではありません。inotify を使用すると、本当に望めば、ファイルシステムの動作すべてをほぼリアルタイムで文字通り監視できます。#3 はポーリングなしでどちらでも可能であることはわかっていますが、どちらのシステムでも正しく動作させるのは非常に難しい場合があることに注意してください。
Spotlight インデックス作成に必要だったので、OS X には適切なフック/コールバックが備わっていると思います。
Linux では、複数のファイル システムが一般的に使用されているという追加の問題が発生します。限られた量のファイル/ディレクトリのみに機能が必要な場合は、定期的に変更を積極的に探すようにしてください。