2010/08/15

ファイルの作成・更新・削除を監視

2010/08/15版以降のNILScriptには、ファイルの変更を監視してイベントハンドラ関数を実行する機能が用意されています。定期的にファイル情報を取得するのではなく、OSのファイル更新イベント通知機能を使用しているので、システムへの負荷は少なくて済みます。
この機能を利用すれば、ファイルの作成などでしか処理の完了を検出できないソフトを含む作業の自動化などを簡単に実現できます。

特定のファイルの作成・変更・削除を監視するには、Fileクラスのインスタンスオブジェクトの「observe()」メソッドを使います。
Main.createNotifyIcon();
var f=new File("E:\\work\\_devel\\ng\\test\\test");
f.observe(['create','remove','modify','renameTo','renameFrom'],function(o){
 Main.notifyIcon.showInfo(o.event+":"+(o.file||""));
});
「Main.createNotifyIcon()」は、NILScript標準のタスクトレイアイコンを作成するメソッドです。Fileオブジェクトのobserve()を使うとスクリプトが常駐状態になるので、スクリプトを手動で終了させるためにトレイアイコンを用意しておく必要があります。
2行目では、パスを指定してFileオブジェクトを生成しています。
3行目が、イベントハンドラの登録処理です、observe()の第1引数には監視するイベント名を指定しますが、配列を指定すれば複数のイベントに対していっぺんにイベントハンドラを登録できます。ここでは、用意されている全てのイベント名を指定しています。
イベントハンドラ関数の中では、第1引数に与えられるオブジェクトの「event」メンバでイベント名を、「file」メンバで「renameTo」「renameFrom」のリネーム後・前のファイルのFileオブジェクトを参照できます。
「Main.notifyIcon.showInfo()」は、タスクトレイアイコンのバルーンでテキストを表示するメソッドです。

ディレクトリ内の不特定多数のファイル・ディレクトリの作成・変更・削除を監視するには、Directoryオブジェクトの「observe()」メソッドを使用します。
var d=new Directory("E:\\work\\_devel\\ng\\test");
d.observe(['add','remove','modify','rename'],function(o){
 Main.notifyIcon.showInfo(o.event+' '+(o.old||"")+' => '+o.file);
});
使い方はほとんどFileオブジェクトのobserve()と同じですが、用意されているイベント名が一部異なります。
また、作成・変更・削除されたファイルが、引数オブジェクトの「file」メンバで、renameイベントでのリネーム前のファイルが「old」メンバで取得できます。

これらの監視機能を使用する上で注意すべきなのは、ファイルの作成イベントが発生した時点では、まだファイルへの書き込みが行われている可能性があると言うことです。書き込み途中のファイルを操作しようとしても、ファイルを開けず失敗してしまったり、中途半端な内容しか読み取られなかったりするでしょう。
これを回避するには、ファイルのパスと最後に更新イベントが発生した時間をオブジェクトに格納しておいて、一定時間更新が発生していないファイルを書き込み完了とみなして操作するなどの工夫をするといいでしょう。

0 件のコメント:

コメントを投稿