gist

ラベル fs の投稿を表示しています。 すべての投稿を表示
ラベル fs の投稿を表示しています。 すべての投稿を表示

2012年2月24日金曜日

Node.jsのfs.watchはMac(10.7)で上手く動作しない件

ディレクトリの監視ができれば、便利なんですが。ファイル探すのに苦労する共有フォルダを監視しておいて、仕様書が上がってきたら、メールで通知とかやってみようと思っていたのですが。

Mac OS X(10.7)だと、fs.watchが動作していないようです。公式ドキュメントでもLinuxとWindows対応、とありました。ハマった。

fs.watch not reporting events on osx

要調査。上手くいかない日は何やっても上手くいかないですね。今日は寝ます。

2012年2月21日火曜日

Node.jsでファイルの更新を監視する。これは意外と使えるかも。

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で通知したらもっと面白そうです。

2012年2月5日日曜日

Node.jsでpackage.jsonファイルを読み込んでみる

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 コマンドで依存関係まで表示されるので、このプログラム自体に意味はないかも。ファイルを読み込む練習ってことで。