2015-08-06 2 views
-1

Мне нужно прочитать распакованный файл в строку. Я добавил эти строки.Разархивируйте файл с диска и прочитайте его данные на узле.js

fs.readFile("report.gz", function(err, data) { 
    zlib.gunzip(data, function(err, dezipped) { 
     if (err) { 
     console.log(err); 
     } else { 
     console.log('length of data = ' + data.length); 
     console.log('length of dezipped =' + dezipped.length); 
     console.log(dezipped.toString("utf-8")); 
     } 
    }); 
    }); 

В результате у меня есть только первая строка из моего файла (в переменной дезапиляции), как я могу читать все строки?

В консоли я вижу

length of data = 88875 (~ 85 Kb) 
Length of dezipped = 528 (bytes) 

я могу сделать вывод, что dezipped являются вырезанные данные настроек уже.

+0

'zlib.gunzip()' распаковывает весь файл, а не только первую строку. Вы уверены, что файл правильно закодирован UTF-8? – robertklep

+0

@robertklep Я обновил свой вопрос. Длина дезапинга медленная (если сравнивать с общей длиной заархивированного файла), а дезапированные данные обрезаны (до использования toString («utf-8»)). – yAnTar

ответ

2

Я не уверен, если это так в вашей ситуации, но я могу воспроизвести нечто подобное путем объединения нескольких блоков GZIP в один файл (который вполне допустимо AFAIK):

$ { echo ONE | gzip; echo TWO | gzip } > output.gz 
$ gzcat output.gz 
ONE 
TWO 

zlib будет только извлечь первый блок:

$ node app.js 
length of data = 48 
length of dezipped =4 
ONE 

я обнаружил, что zlibjs будет обрабатывать эти файлы правильно, хотя:

$ node app.js 
length of data = 48 
length of dezipped =8 
ONE 
TWO 

Это капля в замене, так что это все, что вам нужно сделать для вашего кода для работы:

var zlib = require('zlibjs'); 

Поскольку это чисто JS, это, вероятно, не так быстро, хотя.

+0

Ваш код работает, спасибо. Я предпочитаю использовать внутренние (zlib) вместо внешних библиотек (zlibjs), но теперь я буду использовать ваш вариант. Может быть, в будущем кто-нибудь подскажет, как это сделать с zlib. – yAnTar

+1

@yAnTar существует (исправлена) проблема с этим поведением [здесь] (https://github.com/joyent/node/issues/6032), но тестовые примеры не работают с последними версиями Node.js и iojs. – robertklep

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