skończyło się na przyjęcie tego rozwiązania, co wydaje się najbardziej wydajnych widziałem do tej pory:
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);
})
});
}
stworzyłem moduł npm Dla wygody, o nazwie „firstline”.
Dzięki @dandavis za sugestię użycia String.prototype.slice()
!
można wywołać polecenie 'head' na plikach z poziomu węzła? korzystaj z funkcji pliku/systemu operacyjnego, dla których są one dobre. :) – TZHX
Kod, którego potrzebuję, jest częścią biblioteki, która może być używana w dowolnym systemie operacyjnym obsługującym węzeł JS, więc lepiej byłoby zrobić to za pomocą samego węzła. Jeśli się nie mylę, "głowa" nie jest dostępna na przykład w systemie Windows. – Pensierinmusica
musisz wiedzieć, jak długo trwa ta pierwsza linia, ale możesz przeskoczyć i wczytać pierwszą, powiedzmy 5kb, a następnie podzielić 5kb za pomocą linii, zachowując tylko pierwszą. użyj fs.read() zamiast fs.readFile(): http://nodejs.org/api/fs.html#fs_fs_read_fd_buffer_offset_length_position_callback – dandavis