NodeJS强大的解压ZIP 库

node-stream-zip库是一款非常棒的zip文件压缩库,使用方便,能解压非标准格式的ZIP文件,经过对比,使用起来比
hzip,unzipper,zip-local等库要方便很多,并且支持同步方法和异步方法。并且和adm-zip一样,支持解压制定文件和目录,adm-zip不能解压非标准的zip文件,例如APK文件。

功能特性

不加载整个文档到内存,内容按块读取

支持大文件

非阻塞读取,没有同步输入/输出

快速初始化

无依赖关系,没有二进制插件

内置zlib模块解压缩

deflate,deflate64,sfx,macosx / windows 内置档案支持

ZIP64支持

使用方法

安装

npm install node-stream-zip

打开ZIP文件

const StreamZip = require('node-stream-zip');
const zip = new StreamZip({
    file: 'archive.zip',
    storeEntries: true
});

// 报错提示
zip.on('error', err => { /*...*/ });

可用参数:

storeEntries: 默认为 true 允许使用您zip存档中的条目,否则需要使用条目事件
skipEntryNameValidation:默认为 true 是否检查非法字符路径, 例如../ 或 c:\123。

列出文件列表

zip.on('ready', () => {
    console.log('Entries read: ' + zip.entriesCount);
    for (const entry of Object.values(zip.entries())) {
        const desc = entry.isDirectory ? 'directory' : `${entry.size} bytes`;
        console.log(`Entry ${entry.name}: ${desc}`);
    }
    //读取完毕,记得关闭文件
    zip.close()
});

标准流读取一个文件

zip.on('ready', () => {
    zip.stream('path/inside/zip.txt', (err, stm) => {
        stm.pipe(process.stdout);
        stm.on('end', () => zip.close());
    });
});

解压文件到硬盘

zip.on('ready', () => {
    zip.extract('path/inside/zip.txt', './extracted.txt', err => {
        console.log(err ? 'Extract error' : 'Extracted');
        zip.close();
    });
});

解压目录到硬盘

zip.on('ready', () => {
    fs.mkdirSync('extracted');
    zip.extract('path/inside/zip/', './extracted', err => {
        console.log(err ? 'Extract error' : 'Extracted');
        zip.close();
    });
});

解压所有文件

zip.on('ready', () => {
    fs.mkdirSync('extracted');
    zip.extract(null, './extracted', (err, count) => {
        console.log(err ? 'Extract error' : `Extracted ${count} entries`);
        zip.close();
    });
});

同步读取文件到变量

zip.on('ready', () => {
    const data = zip.entryDataSync('path/inside/zip.txt');
    zip.close();
});

解压文件夹时,监听事件

zip.on('extract', (entry, file) => {
    console.log(`Extracted ${entry.name} to ${file}`);
});

加载期间为每个条目生成一个条目事件

zip.on('entry', entry => {
    // you can already stream this entry,
    // without waiting until all entry descriptions are read (suitable for very large archives)
    console.log(`Read entry ${entry.name}`);
});

可用方法

zip.entries() - 获取所有条目描述
zip.entry(name) - 通过名称获取条目描述
zip.stream(entry, function(err, stm) { }) - 通过条目读取数据
zip.entryDataSync(entry) -同步通过条目读取数据
zip.close()  不用的时候关闭它

github地址

https://github.com/antelle/node-stream-zip

 

THE END