Node环境压缩文件和解压文件

一、压缩文件
1.1压缩文件需要用到得模块是 archiver(下载量蛮高得几百万每周)

文档地址:https://www.npmjs.com/package/archiver

1.2 安装

npm install archiver --save

1.3示例代码

const archiver = require('archiver')
const fs = require('fs')
const archive = async (path) => {
	//path是一个路径
    return new Promise((reslove, reject) => {
    		//创建一个可写入得流
        const output = fs.createWriteStream(path + '.zip');
        //创建要生成得压缩类型 tar |zip
        const zipArchiver = archiver('zip');
        //用管道将数据归档到文件中
        zipArchiver.pipe(output);
        //判断该文件夹中是否有问题文件
        const files = fs.readdirSync(path);
        if (files.length == 0) {
            return false
        }
        for (const key of files) {
            const subcatalog = path + '/' + key;
            const stats = fs.statSync(subcatalog)
            if (stats.isDirectory()) {
            		//文件夹类型 该文件夹下的所有文件都会压缩,包括子目录等
            		//从子目录(subcatalog)追加文件,并在存档中将其命名为key
                zipArchiver.directory(subcatalog, key)
            } else {
            		//文件类型 单个文件
                zipArchiver.file(subcatalog, { name: key });
            }
        }
        //
        output.on('close', function () {
            reslove(true)
        });
        zipArchiver.on('warning', function (err) {
            if (err.code === 'ENOENT') {
                log.trace("warning" + err)
                reject(false)
            } else {
                log.trace(" throw error" + err)
                reject(false)
            }
        });
        zipArchiver.on('error', function (err) {
            log.trace("error" + err)
            reject(false)
        });
        zipArchiver.finalize();
    })

}

二、解压文件
2.1压缩文件需要用到得模块是 node-stream-zip

文档地址:https://www.npmjs.com/package/node-stream-zip

2.2 安装

npm i node-stream-zip

2.1 示例代码

const StreamZip = require('node-stream-zip');
/**
 * @function Unzip 解压文件
 * @file  压缩包的地址
 * @outfile :要解压得目录
 */
const Unzip = async (file, outfile) => {
    return new Promise((reslove, reject) => {
        const zip = new StreamZip({ file: file, storeEntries: true })
        zip.on('error', err => {
            console.log('errerrerrerr', err);
            reject(false)
        });
        zip.on('ready', () => {
            if (!existsSync(outfile)) { mkdirSync(outfile); }
            zip.extract(null, outfile, (err, count) => {
                // console.log(err ? 'Extract error' : `Extracted ${count} entries`);
                console.log(err);
                if (err) {
                    reject(false)
                }
                else {
                    reslove(true)
                }
                zip.close();
            });
        });

    }).catch(err => {
        console.log('eror', err);
    })
}

三、另外一种解压文件的方法

https://blog.csdn.net/weixin_42952411/article/details/107018796
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); });
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值