我正试图像建议的节点-存档器那样使用这里压缩目录的内容。该函数在Node.js运行时环境中的AWS中运行。
我的职能如下:
function zipDirectory(source, outputTarget) {
var archive = archiver("zip");
const stream = fs.createWriteStream(outputTarget, { flags: 'w' });
stream.on("close", () => {
console.log(archive.pointer() + ' total bytes');
console.log('archiver has been finalized and the output file descriptor has closed.');
});
return new Promise((resolve, reject) => {
archive.pipe(stream);
archive.on("error", err => reject(err))
archive.directory(source, false);
archive.finalize();
stream.close();
resolve();
});
}结果是创建了zip,但文件大小为零:
INFO 0 total bytes
INFO archiver has been finalized and the output file descriptor has closed.我也无法用以下错误解压缩归档文件。
INFO Error: end of central directory record signature not found备注:
/tmp/目录中。zip二进制文件与Lambda部署包一起上传,并将其作为子进程运行,但显然不支持它,因为它是一个32位的包。如果您有我可以使用的在Lambda运行时工作的节点外的目录压缩的替代方案,请告诉我。感谢您的帮助,谢谢!
发布于 2020-10-02 21:09:44
好吧,我想错了。
archive.finalize()返回一个承诺,函数在归档完成之前返回。stream.close()是不必要的,因为archive.finalize()对您来说是这样做的,因此不管归档是否完成,流都是关闭的。正确的代码如下所示:
function zipDirectory(source, outputTarget) {
var archive = archiver("zip");
const stream = fs.createWriteStream(outputTarget, { flags: 'w' });
stream.on("close", () => {
console.log(archive.pointer() + ' total bytes');
console.log('archiver has been finalized and the output file descriptor has closed.');
});
return new Promise(async (resolve, reject) => {
archive.pipe(stream);
archive.on("error", err => reject(err))
archive.directory(source, false);
await archive.finalize();
resolve();
});
}https://stackoverflow.com/questions/64163831
复制相似问题