Создание zip-архива из папки и сохранение структуры с помощью Node.js
Я пытаюсь использовать Node.js для создания zip-файла из существующей папки и сохранения структуры.
Я надеялся, что будет простой модуль, позволяющий такие вещи:
archiver.create("../folder", function(zipFile){
console.log('et viola');
});
но я не могу найти ничего подобного!
Я гуглил, и лучшее, что я нашел на данный момент, это zipstream, но, насколько я могу судить, нет способа сделать то, что я хочу. Я действительно не хочу заходить в утилиты командной строки, так как приложение должно быть кроссплатформенным.
Любая помощь будет принята с благодарностью.
Благодарю.
3 ответа
Он не полностью свободен от кода, но вы можете использовать node-native-zip вместе с folder.js. Использование:
function zipUpAFolder (dir, callback) {
var archive = new zip();
// map all files in the approot thru this function
folder.mapAllFiles(dir, function (path, stats, callback) {
// prepare for the .addFiles function
callback({
name: path.replace(dir, "").substr(1),
path: path
});
}, function (err, data) {
if (err) return callback(err);
// add the files to the zip
archive.addFiles(data, function (err) {
if (err) return callback(err);
// write the zip file
fs.writeFile(dir + ".zip", archive.toBuffer(), function (err) {
if (err) return callback(err);
callback(null, dir + ".zip");
});
});
});
}
Это можно сделать еще проще, используя встроенную функцию узла execfile. Он порождает процесс и выполняет команду zip через ОС изначально. Все просто работает.
var execFile = require('child_process').execFile;
execFile('zip', ['-r', '-j', zipName, pathToFolder], function(err, stdout) {
console.log(err);
logZipFile(localPath);
});
-J помечает "путь" для пути к файлу, если вы архивируете sibdirectory и не хотите чрезмерного вложения в zip-файл.
Вот некоторая документация по execfile. Вот справочная страница для почтового индекса.
Using Easy-zip, npm install easy-zip
, ты можешь сделать:
var zip5 = new EasyZip();
zip5.zipFolder('../easy-zip',function(){
zip5.writeToFile('folderall.zip');
});