Нужно заархивировать весь каталог с помощью узла.js
мне нужно заархивировать весь каталог с помощью узла.js. В настоящее время я использую node-zip, и каждый раз, когда процесс запускается, он генерирует недопустимый ZIP-файл (как вы можете видеть из эта проблема Github).
есть еще один, лучше, узел.опция js, которая позволит мне застегнуть каталог?
EDIT: я закончил с помощью архиватором
writeZip = function(dir,name) {
var zip = new JSZip(),
code = zip.folder(dir),
output = zip.generate(),
filename = ['jsd-',name,'.zip'].join('');
fs.writeFileSync(baseDir + filename, output);
console.log('creating ' + filename);
};
пример значения для параметров:
dir = /tmp/jsd-<randomstring>/
name = <randomstring>
обновление: для тех, спрашивая о реализации, которую я использовал,вот ссылка на мой загрузчик:
9 ответов:
Я в конечном итоге с помощью архиватором lib. Отлично работает.
var file_system = require('fs'); var archiver = require('archiver'); var output = file_system.createWriteStream('target.zip'); var archive = archiver('zip'); output.on('close', function () { console.log(archive.pointer() + ' total bytes'); console.log('archiver has been finalized and the output file descriptor has closed.'); }); archive.on('error', function(err){ throw err; }); archive.pipe(output); archive.bulk([ { expand: true, cwd: 'source', src: ['**'], dest: 'source'} ]); archive.finalize();
включить все файлы и Директории:
archive.bulk([ { expand: true, cwd: "temp/freewheel-bvi-120", src: ["**/*"], dot: true } ]);
он использует node-glob(https://github.com/isaacs/node-glob) внизу, поэтому любое соответствующее выражение, совместимое с этим, будет работать.
Archive.bulk
теперь устарел, новый метод это Глоб:var fileName = 'zipOutput.zip' var fileOutput = fs.createWriteStream(fileName); fileOutput.on('close', function () { console.log(archive.pointer() + ' total bytes'); console.log('archiver has been finalized and the output file descriptor has closed.'); }); archive.pipe(fileOutput); archive.glob("../dist/**/*"); //some glob pattern here archive.glob("../dist/.htaccess"); //another glob pattern // add as many as you like archive.on('error', function(err){ throw err; }); archive.finalize();
Я не претендую на то, чтобы показать что-то новое, просто хочу обобщить решения выше для тех, кто любит использовать функции Promise в своем коде (например, я).
const archiver = require('archiver'); /** * @param {String} source * @param {String} out * @returns {Promise} */ function zipDirectory(source, out) { const archive = archiver('zip', { zlib: { level: 9 }}); const lambdaStream = fs.createWriteStream(out); return new Promise((resolve, reject) => { archive .directory(source, false) .on('error', err => reject(err)) .pipe(lambdaStream) ; lambdaStream.on('close', () => resolve()); archive.finalize(); }); }
надеюсь, что это поможет кому-то ;)
Adm-zip имеет проблемы с простым сжатием существующего архива https://github.com/cthackers/adm-zip/issues/64 а также повреждение при сжатии двоичных файлов.
Я также столкнулся с проблемами сжатия коррупции с node-zip https://github.com/daraosn/node-zip/issues/4
узел-архиватор является единственным, который, кажется, хорошо работает для сжатия, но он не имеет никакой функции распаковки.
чтобы передать результат в объект ответа (сценарии, в которых необходимо загрузить zip, а не хранить локально)
archive.pipe(res);
подсказки Сэма для доступа к содержимому каталога работали для меня.
src: ["**/*"]
использовать родной узел
child_process
api для достижения этой цели.нет необходимости в сторонних библиотеках. Две строки кода.
const child_process = require("child_process"); child_process.execSync(`zip -r DESIRED_NAME_OF_ZIP_FILE_HERE *`, { cwd: PATH_TO_FOLDER_YOU_WANT_ZIPPED_HERE });
я использую синхронный API. Вы можете использовать
child_process.exec(path, options, callback)
Если вам нужна асинхронность. Есть намного больше вариантов, чем просто указание CWD для дальнейшей тонкой настройки ваших запросов. Смотрите exec / execSync docs.
Это еще одна библиотека, которая застегивает папку в одну строку : zip-local
var zipper = require('zip-local'); zipper.sync.zip("./hello/world/").compress().save("pack.zip");