2013-09-12 1 views
0

фона -Как строки добавляются в файл, как их обнаружить и прочитать в использовании одного дескриптора файла или потока?

Я пытаюсь использовать Node.js и модуль фс для достижения конечной цели мониторинга файла и обнаружения линий, которые были прилагаемые к нему.

Текущая реализация -

настоящее время я использую fs.watch для мониторинга изменений в файл постоянно, и fs.readFile читать файл, как только часы срабатывала.

Недостатки -

Недостаток такой реализации является то, что она является вычислительно дорого и медленно, чтобы получить прилагаемые линии таким образом, тем более, что она требует чтений в всем содержимом файл, несмотря на моем интерес только добавленные строки.

Идеальное решение -

Я хотел бы использовать вместо fs.createReadStream, чтобы как-то прочитать файл до конца, оставьте дескриптор файла в конце, и начать читать снова после того, как файл был добавлен к.

Я нашел два способа чтения содержимого буфера потока, но в обеих реализациях, которые являются readable.read() и readable.on('data',...), кажется, что поток завершен, когда больше нет данных для чтения, хотя поток не является закрыто. Я не совсем уверен, как продолжать использовать завершенный поток, так как readable.resume() ничего не делает.

Мой вопрос -

Как читать прилагаемую строки из файла в пути, который запускается после того, как файл был изменен? Является ли мое идеальное решение правильным направлением?

Благодарим вас за внимание и помощь!

ответ

1

Это проблема, которую я когда-то имел, и это была довольно головная боль. Это реализация, с которой я столкнулся.

var fs = require('fs'); 

var file = __dirname + '/file.log'; 
fs.stat(file, function(err, stats) { 
    var start = stats.size; 
    // read the entire file here if you need it 
    watchFile(start); 
}); 

function watchFile(start) { 
    fs.watch(file, function(event, filename) { 
    fs.stat(file, function(err, stats) { 
     var stream = fs.createReadStream(file, { 
     start: start, 
     end: stats.size 
     }); 

     var lines = new String(); 
     stream.on('data', function(data) { 
     lines += data; 
     }); 

     stream.on('end', function() { 
     // you have the new lines 
     }); 

     start = stats.size + 1; 
    }); 
    }); 
}; 

Сначала я нахожу размер файла и передаю его функции часов. Каждый раз, когда файл изменяется, я узнаю новый размер файла и читаю его из старой позиции в новую позицию. В некоторых системах функция часов может срабатывать дважды за одно изменение, поэтому вы можете добавить проверки, чтобы избавиться от бесполезных чтений, например, когда начало и конец являются одним и тем же байтом.

+0

Разве это еще лучший способ выполнить такую ​​задачу? – tommybananas

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