ho finito per l'adozione di questa soluzione, che sembra la più performante che ho visto finora:
var fs = require('fs');
var Q = require('q');
function readFirstLine (path) {
return Q.promise(function (resolve, reject) {
var rs = fs.createReadStream(path, {encoding: 'utf8'});
var acc = '';
var pos = 0;
var index;
rs
.on('data', function (chunk) {
index = chunk.indexOf('\n');
acc += chunk;
index !== -1 ? rs.close() : pos += chunk.length;
})
.on('close', function() {
resolve(acc.slice(0, pos + index));
})
.on('error', function (err) {
reject(err);
})
});
}
ho creato un modulo NPM per comodità, denominato "firstline".
Grazie a @dandavis per il suggerimento di utilizzare String.prototype.slice()
!
è possibile chiamare il comando 'head' sui file dal nodo? utilizzare le funzionalità del file/sistema operativo per ciò che sono buoni per. :) – TZHX
Il codice di cui ho bisogno fa parte di una libreria che può essere utilizzata su qualsiasi sistema operativo che supporta il nodo JS, quindi sarebbe meglio farlo utilizzando il nodo stesso. Se non sbaglio, 'head' non è disponibile su Windows, ad esempio. – Pensierinmusica
devi sapere per quanto tempo quella prima riga è, ma puoi sovrascrivere e caricare il primo, ad esempio 5kb, e quindi dividere quel 5kb per linee, mantenendo solo il primo. usa fs.read() invece di fs.readFile(): http://nodejs.org/api/fs.html#fs_fs_read_fd_buffer_offset_length_position_callback – dandavis