我正在编写软件,除其他事项外,使用Dropbox API下载zip存档,然后使用yauzl解压缩该存档。
从DB存储和下载文件的方式通常以嵌套文件夹结束,我需要保持这种方式。
然而,我的yauzl实现不能在保持嵌套文件夹结构的情况下解压缩,如果存档中有嵌套文件夹,它根本不会解压缩。
这是我的unzip函数,它是默认的yauzl示例,在末尾添加了本地文件写入。
const unzip = () => {
let zipPath = "pathToFile.zip"
let extractPath = "pathToExtractLocation"
yauzl.open(zipPath, {lazyEntries: true}, function(err, zipfile) {
if (err) throw err;
zipfile.readEntry();
zipfile.on("entry", function(entry) {
if (//$/.test(entry.fileName)) {
// Directory file names end with '/'.
// Note that entries for directories themselves are optional.
// An entry's fileName implicitly requires its parent directories to exist.
zipfile.readEntry();
} else {
// file entry
zipfile.openReadStream(entry, function(err, readStream) {
if (err) throw err;
readStream.on("end", function() {
zipfile.readEntry();
});
const writer = fs.createWriteStream(path.join(extractPath, entry.fileName));
readStream.pipe(writer);
});
}
});
});
}
删除if (//$/.test(entry.fileName))
检查将顶级文件夹视为文件,提取它,没有文件扩展名,大小为0kb。我想要它做的是提取存档,包括子文件夹(至少深度为2,要意识到zip爆炸的风险)。
是否可以使用yauzl?
代码需要在提取路径处创建目录树。您可以使用fs.mkdir
和recursive
选项,以确保在解压到该目录之前存在该目录。
if (//$/.test(entry.fileName)) {
// Directory file names end with '/'.
// Note that entries for directories themselves are optional.
// An entry's fileName implicitly requires its parent directories to exist.
zipfile.readEntry();
} else {
// file entry
fs.mkdir(
path.join(extractPath, path.dirname(entry.fileName)),
{ recursive: true },
(err) => {
if (err) throw err;
zipfile.openReadStream(entry, function (err, readStream) {
if (err) throw err;
readStream.on("end", function () {
zipfile.readEntry();
});
const writer = fs.createWriteStream(
path.join(extractPath, entry.fileName)
);
readStream.pipe(writer);
});
}
);
}