ディレクトリの監視ができれば、便利なんですが。ファイル探すのに苦労する共有フォルダを監視しておいて、仕様書が上がってきたら、メールで通知とかやってみようと思っていたのですが。
Mac OS X(10.7)だと、fs.watchが動作していないようです。公式ドキュメントでもLinuxとWindows対応、とありました。ハマった。
fs.watch not reporting events on osx要調査。上手くいかない日は何やっても上手くいかないですね。今日は寝ます。
ディレクトリの監視ができれば、便利なんですが。ファイル探すのに苦労する共有フォルダを監視しておいて、仕様書が上がってきたら、メールで通知とかやってみようと思っていたのですが。
Mac OS X(10.7)だと、fs.watchが動作していないようです。公式ドキュメントでもLinuxとWindows対応、とありました。ハマった。
fs.watch not reporting events on osx要調査。上手くいかない日は何やっても上手くいかないですね。今日は寝ます。
Node.jsでファイルの更新を監視するには、fs.watchFile()を使います。
var fs = require('fs');
var http = require('http');
fs.watchFile('message.txt', function(curr, prev) {
console.log('現在の更新:' + curr.mtime);
console.log('前の更新:' + prev.mtime);
});
http.createServer(function(req, res) {
res.writeHead(200);
res.end('fs.watchFile() test');
}).listen(3000);
console.log('server started.');
空のmessage.txtを作ります。
$ echo '' > message.txt
Nodeを起動します。
$ node app.js &
message.txt に追記してみましょう。
$ echo 'Hello World!' >> message.txt $ 現在の更新:Tue Feb 21 2012 23:03:20 GMT+0900 (JST) 前の更新:Tue Feb 21 2012 23:02:14 GMT+0900 (JST) $
前回のファイル情報と、更新後のファイル情報を参照できます。
業務アプリケーションの連携なかではCSVファイルを特定のフォルダに保存してデータをやりとりするのもしばしば。意外と使えるかもしれません。ファイル変更をsocket.ioで通知したらもっと面白そうです。
Node.jsのfsモジュールを、ファイルの入出力ができます。
npmでインストールしたモジュールを読み込んでみます。
npmでインストールしたモジュールは、node_modulesディレクトリに保存されます。パッケージ名やバージョン、依存パッケージなどの詳細情報は、node_modules/パッケージ名/package.json に記述されています。fsを使って、package.jsonを読み込んでみます。
read_packages.js
// File Systemモジュールを読み込む
var fs = require('fs');
var readPackageJson = function(path, cb){
// パスの読み込み開始
var path = path + "/node_modules";
fs.readdir(path, function(err, dirs){
if(err) cb(err, null);
// dirsには指定したパスのファイル名・ディレクトリ名の一覧が入っている
for(var i = 0; i < dirs.length; i++){
var dir = dirs[i];
// 頭文字が.の場合読み込まない
if(dir.charAt(0) === '.') continue;
// package.jsonのパスを指定
var jsonPath = path + "/" + dir + "/package.json";
// package.jsonを読み込み開始
fs.readFile(jsonPath, function(err, data){
if(err) cb(err, null);
// dataには読み込んだBufferが入っている
// toString('utf8')で文字列にする
var jsonStr = data.toString('utf8');
// JSONをパースしてコールバック
cb(null, JSON.parse(jsonStr));
});
}
});
};
// 実行
readPackageJson(".", function(err, json){
if(err) throw err;
console.log(json.name +"@" + json.version );
});
実行結果
$ node read_packages.js express@2.5.6 socket.io@0.8.7
まあ、npm list コマンドで依存関係まで表示されるので、このプログラム自体に意味はないかも。ファイルを読み込む練習ってことで。