2016-05-04 7 views
0

socket.ioとfs.watch関数を使用してnode.jsにtail -fの実装を作成しました。tail -f node.jsの実装

fs.readFileを使ってファイルを読み、それを行の配列に変換してクライアントに返します。現在の長さを変数に格納します。 "ファイル変更"イベントが発生するたびに、ファイル全体を再度読み込み、行の配列に変換します。そして、古い長さと現在の長さを比較してください。それをスライスしてください。

fileContent.slice(oldLength, fileContent.length) 

これは私に変更された内容を与えます。完璧に走っています。

問題:ファイルが変更されるたびにファイル全体を読み取っていますが、ファイルが大きすぎると効率的ではありません。それで、一度ファイルを読む方法はありますか?変更があれば、変更された内容を取得しますか?

私もこれで問題がある

var spawn = require ('child_process').spawn; 
var child = spawn ('tail', ['-f', logfile]); 
    child.stdout.on ('data', function (data){ 
    linesArray = data.toString().split("\n") 
    console.log ("Data sent" + linesArray[0]); 

    io.emit('changed', { 
     data: linesArray, 
    }); 
}); 

「-fテール」の子プロセスを生成、試してみました:(「データ」)上の

  1. イベントは、私が保存し、複数の時間を発射しますいくつかのコンテンツを書くことによってログファイル。
  2. 最初の読み込みでは、ファイルの最後の10行が正しく返されます。しかし、変更がある場合は、コンテンツ全体を何度も何度も返します。

この問題を解決する方法があれば教えてください。それまで私はインターネットを掘り出すだろう。

+1

あなたは[ 'tail'](https://www.npmjs.com/package/tail)のようなパッケージを使用して検討していますか? – robertklep

+0

はい、私はむしろ、外部のnpmパッケージに依存するのではなく、自分の実装に固執したいと思います。私はネイティブなものが欲しい。 –

+1

しかし、既存のモジュールは、同様のものを実装する方法の例として役立ちます。 – robertklep

答えて

0

他の人のコードを読んで解決策を得ました。だから、解決策は、ファイルを開くfs.openを使用して、ファイル全体を読むのではなく、fs.read()関数を使って特定のブロックをファイルから読み込むことでした。 fs.open/fs.readについて知りたい場合は、nodejs-file-systemをお読みください。

公式ドキュメント:fs.read

関連する問題