Node.js - Zip/ распаковать папку

Я погружаюсь в Zlib для node.js. Мне удалось сжать и распаковать файлы, используя предоставленные примеры ( http://nodejs.org/api/zlib.html), но я не смог больше узнать о том, как сделать то же самое для папок?

Одна из возможностей (но я считаю, что возиться) - это использовать node-zip модуль и добавление всех файлов папки по одному. Но я столкнусь с проблемой при распаковке (в этом случае я потеряю папки).

Любая идея, как сжать (а затем распаковать) всю папку (с учетом иерархии подпаяльников) с помощью Node.js?

Благодарю.

2 ответа

Решение

Я наконец-то получил его с помощью @generalhenry (см. Комментарии к вопросу) и

как уже упоминалось в комментариях, нам нужно сжать папку в два этапа:

  1. Преобразуйте папку в .tar файл

  2. Сжать .tar файл

Для выполнения первого шага мне потребовалось два модуля node.js:

npm install tar
npm install fstream

Первый позволяет нам создавать .tar файлы. Вы можете получить доступ к исходному коду здесь https://github.com/isaacs/node-tar

Модуль второго узла поможет нам прочитать папку и записать файл. По поводу основного fs модуль node.js, я не знаю, возможно ли прочитать каталог (я не говорю о получении всех файлов в массиве, используя fs.readdir, но обработка всех файлов и их организация в папках).

Затем, когда я преобразую папку в .tar файл, я могу сжать его, используя Gzip() из Zlib,

Вот окончательный код:

var fstream = require('fstream'),
    tar = require('tar'),
    zlib = require('zlib');

fstream.Reader({ 'path': 'path/to/my/dir/', 'type': 'Directory' }) /* Read the source directory */
.pipe(tar.Pack()) /* Convert the directory to a .tar file */
.pipe(zlib.Gzip()) /* Compress the .tar file */
.pipe(fstream.Writer({ 'path': 'compressed_folder.tar.gz' })); /* Give the output file name */

Это помогло мне сжать всю папку с помощью node.js

Еще 2 вещи:

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

  • Я использовал fstream модуль, чтобы помочь мне справиться с исходным каталогом. Можно ли это обойти, используя fs? Я не знаю (пожалуйста, прокомментируйте, если у вас есть идея).

Предоставляем обновленный ответ, поскольку пакет tar обновляется с 2013 года.

Чтобы добиться того же результата, код намного проще и понятнее:

const tar = require("tar"); // version ^6.0.1
const fs = require("fs");

tar.c(
  {
    gzip: true // this will perform the compression too
  },
  ["path/to/my/dir/"]
).pipe(fs.createWriteStream('path/to/my/dir.tgz'));

Нет необходимости явно использовать zlib.

Вы можете использовать модуль tar-stream для создания архива tar. Это намного более гибко и проще, чем node-tar в этом:

  • Вы можете добавлять файлы в архив (не только каталоги, что является ограничением для узла-tar)
  • Он работает с обычными потоками файловой системы узла (как ни странно, использование узла-tar требует использования модуля fstream)
  • Это довольно полно документировано (node-tar не очень хорошо документировано)
  • Вы можете создать архив, не затрагивая файловую систему

Создайте архив tar, затем сожмите его с помощью zlib, затем запишите его в любое место (сеть, файловая система и т. Д.).

Другие вопросы по тегам