2016-05-04 2 views
0

Я создал реализацию tail -f в node.js, используя функцию socket.io и fs.watch.tail -f реализация в node.js

Я прочитал файл, используя fs.readFile, преобразует его в массив строк и возвращает его клиенту. Сохраняет текущую длину переменной. Затем всякий раз, когда происходит событие «файл изменено», я перечитываю весь файл, преобразует его в массив строк. А затем сравните старую длину и текущую длину. и отрезать его как

fileContent.slice(oldLength, fileContent.length) 

это дает мне измененный контент. Так работает отлично.

Проблема: я читаю весь файл каждый раз, когда файл изменяется, что неэффективно, если файл слишком велик. Итак, есть ли способ, когда-либо прочитывать файл, а затем получает измененный контент, если есть какие-либо изменения?

Я также пробовал, дочерний процесс нерест для «хвост -f»

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, 
    }); 
}); 

проблема с этим:

  1. на («данные») событие срабатывает несколько раз, когда я сохранить файл журнала, написав некоторый контент.
  2. При первой загрузке он правильно возвращает последние десять строк файла. Но если есть какое-то изменение, то он возвращает все содержимое снова и снова.

Так что если у вас есть идея решить эту проблему, дайте мне знать. До тех пор я буду копать в Интернете.

+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

Смежные вопросы