主題はそれをすべて言います-通常、簡単でクロスプラットフォームの方法は、インテリジェントにポーリングすることです. しかし、すべての OS には、ポーリングせずに通知する手段がいくつかあります。合理的にクロスプラットフォームの方法で可能ですか? (私はWindowsとLinuxしか気にしませんが、Macを使用しているので、posixが役立つと思いましたか?)
7 に答える
Linux ユーザーはinotifyを使用できます
inotify は、ファイル システム イベント通知を提供する Linux カーネル サブシステムです。
Windows フェロー向けの特典:
- MSDN のファイル変更通知
- 「フォルダが変更されたとき」の記事
- 変更時のファイル システム通知
Qt ライブラリには、ファイルが変更されたときにクロスプラットフォーム通知を提供するQFileSystemWatcherクラスがあります。Qt を使用していない場合でも、ソースが利用できるため、独自の実装のサンプルとして参照できます。Qt には、Windows、Linux、および Mac 用の個別の実装があります。
Leopard にはFile System Events APIがあります。
私は実際に、商用の C++ コード ベースで使用するためにこのシステムを構築したことがあります。
POSIX: inotify を使用します。これは文字通りこのジョブのために構築されたシステム全体です
。 Windows: 「変更イベント」を使用します。自分で接着剤とレポートを作成する必要があります (必要なすべての API が利用可能ですが、inotify が提供するワンストップ ショッピングはありません)。
イベントを転送するための「通知スレッド」で検出できる一般的なことは次のとおり
です。これは、フォルダーやファイルの移動、作成、削除、コピーなどです。
2) ファイルの読み取りと書き込み (特に書き込み)。非同期 I/O を使用している場合、通知が順不同で表示される可能性があることに注意してください。
3) 誰かがフラッシュドライブを接続するなど、新しいボリュームが入ってきたとき。
inotify は特に非常にきめ細かい制御を提供しますが、Windows はそうではありません。inotify を使用すると、必要に応じて、ファイルシステムが実行しているすべてのことを文字通りほぼリアルタイムで監視できます。#3 がポーリングなしで両方で可能であることは知っていますが、どちらのシステムでも正しく動作させるのは非常に難しい場合があることに注意してください。
POSIX自体にそのための機能があるとは思いません。私が見たクロスプラットフォームに最も近いのはFAMで、Linux、BSD、および Irix で動作するようですが、Windows および MacOS に移植するのがどれほど簡単かはわかりません。
Spotlight のインデックス作成に必要だったので、OS X には適切なフック/コールバックがあると思います。
Linux では、複数のファイル システムが一般的に使用されているという追加の問題があります。限られた量のファイル/ディレクトリに対してのみ機能が必要な場合は、定期的に変更を積極的に探すようにします。
私はそれらを使用していませんが、libeventまたはlibevはあなたが望むもののようです。