节点有各种zip模块。一般来说,他们似乎遵循这样的模式:
// Creating a zipfile object
var zf = new zipfile.ZipFile('./test/data/world_merc.zip');
// the zipfile has a list of names:
// zf.names[0] === 'world_merc.prj'
上面的代码段已从node-zipfile
自述文件https://github.com/mapbox/node-zipfile中解除,但例如AdmZip
包中存在类似的示例:https://github.com/cthackers/adm-zip。
所以这让我觉得很奇怪,因为看起来这两个库都假定同步代码(至少,你需要打开文件来读取标题,这是阻塞,对吧?)
所以我挖掘了AdmZip
的实现,结果发现你可以将缓冲区传递给AdmZip
构造函数,例如你可以这样做:
fs.readFile('./my_file.zip', function(err, buffer) {
var zip = new AdmZip(buffer);
var zipEntries = zip.getEntries();
});
但这只是稍微好一些,因为它似乎AdmZip
期望我只是为了访问标题而读取整个文件。我阅读了zip规范,我的理解是列出内容的文件“中心目录文件头”无论如何都在文件的末尾。
所以这是问题的超长引导,是否存在一个节点库,它将有效地和异步地读取zip内容(例如,如果我要做的就是看,我没有在内存中实现整个zip文件在中央目录标题)?