Мне показалось, что проще всего обернуть мою собственную оболочку вокруг 7-zip, но вы можете также легко использовать zip или любой другой инструмент zip из командной строки, доступный в вашей среде выполнения. Этот конкретный модуль просто делает одну вещь: заархивировать каталог.
const { spawn } = require('child_process');
const path = require('path');
module.exports = (directory, zipfile, log) => {
return new Promise((resolve, reject) => {
if (!log) log = console;
try {
const zipArgs = ['a', zipfile, path.join(directory, '*')];
log.info('zip args', zipArgs);
const zipProcess = spawn('7z', zipArgs);
zipProcess.stdout.on('data', message => {
// received a message sent from the 7z process
log.info(message.toString());
});
// end the input stream and allow the process to exit
zipProcess.on('error', (err) => {
log.error('err contains: ' + err);
throw err;
});
zipProcess.on('close', (code) => {
log.info('The 7z exit code was: ' + code);
if (code != 0) throw '7zip exited with an error'; // throw and let the handler below log it
else {
log.info('7zip complete');
return resolve();
}
});
}
catch(err) {
return reject(err);
}
});
}
Используйте это так, если вы сохранили вышеуказанный код в zipdir.js
. Третий параметр log
является необязательным. Используйте его, если у вас есть собственный регистратор. Или полностью удалите мои неприятные записи журнала.
const zipdir = require('./zipdir');
(async () => {
await zipdir('/path/to/my/directory', '/path/to/file.zip');
})();