2012-06-26 20 views
11

ファイルが変更されたときのディレクトリ(約5レベルのサブディレクトリを持つ何千ものファイル)を監視したいとします。私はFSEvents APIを使ってディレクトリ内のファイルが変更されたときにそれを監視することができますが、どのファイルを変更したのかを判断する方法はわかりません。 This参考資料私は、バイナリツリーを構築し、イベントがトリガされるたびにツリーをトラバースすると、どのファイルが変更されたかを判断する最も良い方法はです。そうでない場合は、の方が良いでしょうか?の代替品ですか?ファイルの変更を監視するディレクトリ

ディレクトリを再帰的にスキャンしてkqueueをすべてのファイルに添付する方がよいですか?私はそれが何千ものファイルでうまくいくかどうか分かりません。

答えて

8

これまでにUKKQueueを使用しましたが、結果は混在しています。

私は最近、より良い解決策を認識しましたが、私はこれを試していません。ライオンをターゲットにする必要がある場合は、NSFileCoordinatorを使用するのが新しいベストプラクティスの方法だと思います。あなたは(presentedItemURLプロパティ)に興味を持っているどのディレクトリを示すために、NSFilePresenterのメソッドを実装し、サブ項目が移動する/変更/

私は大好きです(presentedSubitemDidChangeAtURL:のようなメソッドを経由して)削除されたときにシステムが通知されますあなたがその道を行くなら、それがどのように機能するか聞くこと。

+0

Jesse、NSFileCoordinator/NSFilePresenterを使用してこれまでのフォルダの監視を実装しようとしましたか?私はこのソリューションを機能させることができませんでした。単にイベントについて私に通知するわけではありません。 –

+0

@DaveNewman NSFileCoordinatorは、変更を加えているプログラムがそれを使用している場合にのみ機能します。 (オプトインAPI)ほとんどのCocoaプログラムがこれを行います。おそらく、あなたは下位レベルのAPIによって行われている変更でしょうか? –

+0

私は分かりません。たとえば、私のフォルダ用のファイルプレゼンター、例えば '/ Users/Dave/MyFolder'を作成しました。今度は、このディレクトリにファイルをドロップ(ドラッグアンドドロップ)すると、 'displayedSubitemDidChangeAtURL:'メソッドだけがシステムによって呼び出されますが、 'renderedSubitemDidAppearAtURL:'は呼び出されません。また、Finderでいくつかのファイルを削除すると、 'accommodPresentedSubitemDeletionAtURL'も呼び出されません。私は何かが欠けていたか? –

6

kFSEventStreamCreateFlagFileEventsを使用してストリームを作成した場合、監視されたディレクトリへの変更の通知ではなく、各ファイルの変更イベントが発生します。残念ながら、これはOSX 10.7以降でのみ利用可能です。

関連する問題