フォルダ内のファイルを監視するFSEvent
FSEventとは、File System Eventのことだ。ファイルシステムに発生したイベントを監視して、通知してくれるフレームワークである。こう書くと、まるで汎用的に使えるようだが、ほぼTime Machine専用と考えていい。
なぜTime Machine専用かというと、これを説明するには、このフレームワークで何ができるかよりも、何ができないか、ということを説明する方が早い。このフレームワークは、ファイルシステムに変更が発生したときにそれを通知してくれるのだが、その単位はフォルダごとになる。特定のファイルを監視したり、ファイルに対する変更を知ることはできない。
どういうことかというと、あるフォルダの中のファイルに何らかの変更が発生したということは、分かる。だが、どのファイルが変更されたかということは、分からない。同様に、フォルダへのファイルの追加や削除が発生したことは、分かる。だが、どのファイルが追加、削除されたかということは、分からない。
つまり、何かが起きた、ということは分かるのだが、何が起きたかは分からないのだ。非常にざっくりとした仕様で、完全にTime Machineに合わせて作られていると言えるだろう。
FSEventを実験する
そんなFSEventだが、どのように動作するのか、ちょっと実験してみよう。開発環境とともにインストールされるサンプルの中に、RubyCocoaでFSEventを利用するものがあるので、それを利用する。RubyCocoaについては、本連載の第一回を参照してほしい。
サンプルは、/Developer/Exapmles/Ruby/RubyCocoa/Scriptsにある、watcher.rbというファイルだ。これは、コマンドラインから実行するという前提で作られているので、ターミナルを起動しよう。次のように入力してほしい。
$ cd /Developer/Exapmles/Ruby/RubyCocoa/Scripts
$ ruby watcher.rb ~/Desktop
2行目で、watcher.rbを実行している。このとき、引数としてフォルダのパスを渡すと、FSEventを使ってそのフォルダを監視してくれるのだ。上のように入力すると、デスクトップを監視してくれる。
試しに、デスクトップ上で色々なファイル操作を行ってみよう。たとえば、デスクトップ上のファイルを開き、編集をして保存する。または、デスクトップにファイルを追加する、デスクトップからファイルを削除する、といったものだ。
すると、ターミナル上に、ファイルシステムイベントが通知された旨が表示されるだろう。
確かに、何らかのイベントは起きている。でも、何が起きたかかは分からない。これが、FSEventだ。そしてこれは、プラグラムから利用するのも非常に簡単なのだ。次ページでそれをみてみよう。