2011-10-11 28 views
7

ディレクトリの内容を監視する方法を探しています。私は2つのアプローチを試みました。ディレクトリ Cocoa/Cocoa Touchでディレクトリを監視する

を監視するためのディレクトリに

  • 使用GCDを監視する

    1. 使用したkqueueは、私が遭遇しています問題は、私が変更されたファイルを検出する方法を見つけることができないということです。私は数千ものファイルが潜在的にあるディレクトリを監視しようとしています。どのファイルが変更されたのかを知るために、すべてのファイルに対してstatを呼びたくありません。私はまた、そのディレクトリ内のすべてのファイルに対して個別のディスパッチソースを設定したくありません。これは現在可能ですか?

      注:私は、私のアドバイスは、ちょうどあなたがファイルの何千もの話をしている場合でも、弾丸をかむと、別のスレッドでディレクトリスキャンを行うことですkqueueGCD

  • +0

    Mac OS XとiOSの両方をターゲットにしていますか? –

    +0

    私はOS Xをターゲットにしていますが、iOSで動作するかどうかについても関心がありました。 – DHamrick

    答えて

    4

    と私の実験監視ファイルを文書化しています。しかし、あなたが主張するなら、ここに答えがあります:

    あなたの袖を巻いたり、カーネルダイビングをすることなくこれを行う方法はありません。

    FSEventsフレームワークを使用するのは、ファイルの作成、編集、または削除(属性と関連する作業)の際に通知を送信することです。概要はhereであり、誰かがAPIの周りにObjective C wrapperと書いていますが、試していません。しかし、概観は、ファイルの変更についての部分、kqueueのようなディレクトリについては言及していません。私はhereのコードをヘッダファイルhereと共に使用して、私自身のロガーをコンパイルして、個々のファイルレベルでイベントを取得することができました。ロガーをバックグラウンドで実行して監視するには、アプリにコードを書く必要があります。

    また、すべてのファイルシステムのアクティビティを常に監視する「fs_usage」コマンドを参照してください(そして、私はすべてをとしています)。これはすでにダーウィンに付属しているので、自分でコンパイルする必要はありません。 kqueueを使用してディレクトリの変更を監視すると同時に、 "fs_usage"からの出力を監視することができます。ディレクトリが変更されたことをkqueueから通知された場合は、fs_usageの出力を調べ、書き込まれたファイルを確認し、変更されたディレクトリに対してファイル名を確認することができます。 fs_usageはFirehoseですので、Grepと一緒にいくつかのオプションを使用してそれを守る準備をしてください。

    FSEventsロガーとfs_usageの両方がルートアクセスを必要とするため、OS Xアプリケーションで使用するには、事前にユーザーの承認を得る必要があります(Authorization Services Programming Guideの情報それをするために)。

    これはすべてひどく複雑に聞こえる場合は、それが原因です。しかし、少なくともあなたは難しい方法を見つける必要はありませんでした!

    +3

    FOSventsはiOSで利用できますか? iOSプログラムはfs_usageのような任意のコマンドを実行できますか? –

    +0

    iOSの場合、FSEventsは本当に必要ではありません。すべてのアプリケーションがサンドボックス化されているため、Documentsフォルダ内のファイルを操作して自分自身を引き起こさないファイルシステムイベントはありません。私はあなたがiCloudファイルシステムでFSEventsを使用できることを示すiOS5についての注意を見ました。もしあなたが* jailbroken * phones(ささやき)について話しているのであれば、FSEventsが送信される可能性はありますが、すばらしいGoogleの検索では決して確定しませんでした。彼らはfs_usageのようなツールを持っているのではないかと疑いますが、自分でコンパイルすることはできます... – sgress454

    関連する問題