特定のフォルダを定期的に監視して、入ってきたファイルをバッチ処理する……というのは、実に「よくある処理」だ。
AppleScriptにおけるデザインパターンというものを考えてみれば、間違いなく5本の指に入るぐらいの頻出処理である。
だが……のどかに数ファイルぐらいが一度に監視フォルダに入ってくるぐらいならよいが、これがいきなり数十万個も入ってきた場合にはどうなるだろうか?
ずっと処理が返ってこないか、下手をすればスクリプトの実行プロセスがクラッシュするかもしれない。というか、途中でkillしたくなること請け合いである。
いまやっている仕事の事前のシミュレーションで、そのような利用形態が発生するに違いない、と思い至り……3万ファイルほど監視フォルダに入っていた場合でもファイル名の一覧リストを安全かつ迅速に取得できるプログラムをAppleScriptで書いてみた。
まず、ファイル一覧をFinderに命令して取得させるのは危険である。機能の高さが裏目に出て、通信量は増えるわ何わでFinderとAppleScriptの間でそのような処理を行ってはいけない。entire contentsによる一覧取得もちょっと危ない。entire contentsの高速化も可能だが、毎度毎度entire contentsのお世話になるのは避けたいところだ(あんまり信じていない)。
そこで、BSDレイヤーにいるlsコマンドを呼び出して、結果をすぐさまファイルに書き出し、さらに1行ずつ読み込んでリストに追加する、という処理を書いてみた。
さらに、リストへのアクセスを高速化するため「a reference to」で別の変数経由で参照アクセスするようにして、一気にファイル名を取得。
さまざまなテクニックを駆使した結果、PowerMac G5/2.5GHz上で、全処理を3秒ぐらいで終わるようになった。とっても安全だし、これならファイル数が数十万のオーダーになってもまあそれほど時間もかからないだろう。