Этот код не претендует на то, чтобы быть очень быстрым, поскольку он синхронный, но он работает.
const JSZip = require("jszip");
const path = require('path');
const fs = require('fs');
const isDirectory = (filePath) => fs.statSync(filePath).isDirectory();
const findFiles = (dir, fileNames, recursive = false) => {
const foundFiles = [];
fs.readdirSync(dir).forEach(file => {
const filePath = path.join(dir, file);
if(recursive && isDirectory(filePath)) {
foundFiles.push(...findFiles(filePath, fileNames, true));
} else if(fileNames.includes(file)){
foundFiles.push(filePath);
}
});
return foundFiles;
};
const getFileName = filePath => filePath.indexOf("/") !== -1 ?
filePath.substr(filePath.lastIndexOf("/")) : filePath;
const zipFiles = (filePaths, zipPath) => {
const zip = new JSZip();
filePaths.forEach(filePath => {
const fileName = getFileName(filePath) + "_" + Date.now();
const content = fs.readFileSync(filePath);
zip.file(fileName, content);
});
zip.generateNodeStream({type: 'nodebuffer', streamFiles: true})
.pipe(fs.createWriteStream(zipPath))
.on('finish', () => console.log(`${zipPath} has been created.`));
};
const filesDir = `${__dirname}/../resources`;
zipFiles(findFiles(filesDir, ["test1.txt"], true), `${filesDir}/out.zip`);