使用nodejs优雅的解压zip文件

本文介绍了如何使用node-stream-zip库来优雅地解压ZIP文件,该库支持非标准格式的ZIP文件,包括APK,并提供同步和异步方法。内容包括安装、打开ZIP文件、列举文件列表、读取和解压文件等操作,以及相关的方法介绍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

node-stream-zip 是查看和提取大型 ZIP 文件Node.js 库。特性:从不加载完整的归档到内存,一切都是通过块读取大型归档支持所有操作都是非阻塞,非同步 i/o快速初始化无依赖,无二进制组件内置 zlib 模块解压deflate, deflate64, sfx, macosx/windows 内置归档ZIP64 支持安装$ npm install node-stream-zip使用var StreamZip = require('node-stream-zip');   var zip = new StreamZip({       file: 'archive.zip',       storeEntries: true     }); zip.on('error', function(err) { /*handle*/ }); zip.on('ready', function() {     console.log('Entries read: '   zip.entriesCount);     // stream to stdout     zip.stream('node/benchmark/net/tcp-raw-c2s.js', function(err, stm) {         stm.pipe(process.stdout);     });     // extract file     zip.extract('node/benchmark/net/tcp-raw-c2s.js', './temp/', function(err) {         console.log('Entry extracted');     });     // extract folder     zip.extract('node/benchmark/', './temp/', function(err, count) {         console.log('Extracted '   count   ' entries');     });     // extract all     zip.extract(null, './temp/', function(err, count) {         console.log('Extracted '   count   ' entries');     });     // read file as buffer in sync way     var data = zip.entryDataSync('README.md'); }); zip.on('extract', function(entry, file) {     console.log('Extracted '   entry.name   ' to '   file); }); zip.on('entry', function(entry) {     // called on load, when entry description has been read     // 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); });
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值