Node.js - Zip/ распаковать папку
Я погружаюсь в Zlib для node.js. Мне удалось сжать и распаковать файлы, используя предоставленные примеры ( http://nodejs.org/api/zlib.html), но я не смог больше узнать о том, как сделать то же самое для папок?
Одна из возможностей (но я считаю, что возиться) - это использовать node-zip
модуль и добавление всех файлов папки по одному. Но я столкнусь с проблемой при распаковке (в этом случае я потеряю папки).
Любая идея, как сжать (а затем распаковать) всю папку (с учетом иерархии подпаяльников) с помощью Node.js?
Благодарю.
2 ответа
Я наконец-то получил его с помощью @generalhenry (см. Комментарии к вопросу) и
как уже упоминалось в комментариях, нам нужно сжать папку в два этапа:
Преобразуйте папку в
.tar
файлСжать
.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, затем запишите его в любое место (сеть, файловая система и т. Д.).