Нужно заархивировать весь каталог с помощью узла.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 57

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");

Я нашел эту небольшую библиотеку, которая инкапсулирует то, что вам нужно.

npm install zip-a-folder

const zip-a-folder = require('zip-a-folder');
await zip-a-folder.zip('/path/to/the/folder', '/path/to/archive.zip');

https://www.npmjs.com/package/zip-a-folder