Существуют различные zip-модули для узла. Как правило, они, кажется, следуют образцу, как это:эффективное чтение заголовка zip-файла в node.js
// Creating a zipfile object
var zf = new zipfile.ZipFile('./test/data/world_merc.zip');
// the zipfile has a list of names:
// zf.names[0] === 'world_merc.prj'
Сниппет выше был снят с node-zipfile
README здесь https://github.com/mapbox/node-zipfile, но, например, подобный пример существует для AdmZip
пакета: https://github.com/cthackers/adm-zip.
Так что это показалось мне странным, потому что кажется, что обе эти библиотеки предполагают синхронный код (по крайней мере, вам нужно открыть файл, чтобы прочитать заголовок, который блокируется, правильно)?
Итак, я вырыл в реализацию AdmZip
, и, оказывается, вы можете передать буфер в конструктор AdmZip
, например. Вы можете сделать это:
fs.readFile('./my_file.zip', function(err, buffer) {
var zip = new AdmZip(buffer);
var zipEntries = zip.getEntries();
});
Но это лишь незначительно лучше, потому что кажется, AdmZip
ожидает, что я хочу, чтобы прочитать весь файл в только для доступа к заголовку. Я читал спецификацию zip, и я понимаю, что файл «центральный файл каталога», который перечисляет содержимое, находится в конце файла в любом случае.
Так что это было очень длинное руководство в вопросе, существует ли библиотека узлов, которая будет эффективно и асинхронно читать содержимое zip (например, не реализовать весь zip-файл в памяти, если все, что я собираюсь сделать, это посмотрите на центральный заголовок каталога)?