Node.js 应用探索文件解压缩示例详解

目录
  • 引言
  • compressing
    • 解压
    • 压缩
  • archiver
  • adm-zip
    • 压缩
    • 解压缩
  • 总结

引言

今天在使用 node 脚本对文件处理时,需要实现一个功能,要对一个 zip 压缩包解压出来,修改里面的文件后,重新打包成zip包。node 解压缩文件的场景在实际应用中还是比较常见,下面介绍几个用来解压缩文件的库和使用方法。

compressing

compressing 是一个使用起来方便、功能非常强大的node库,它可以对文件、文件夹进行解压或压缩,支持tar、gzip、tgz、zip等多种格式。

简单安装之后 npm install compressing,以 zip 压缩包为例

解压

解压比较简单,tar、gzip、zip 都是同个 API

const compressing = require('compressing');
// 将压缩包解压到 test 文件夹中
compressing.zip.uncompress('./test.zip','./test').then(() => {
	console.log('解压完成')
}).catch(() => {
	console.log('解压失败')
})
// 将压缩包解压到当前文件夹中
compressing.zip.uncompress('./test.zip','./')

压缩

const compressing = require('compressing');
// 压缩一个文件
compressing.zip.compressFile('E:/1.txt','E:/1.zip').then(() => {
	console.log('压缩完成')
}).catch(() => {
	console.log('压缩失败')
})
// 压缩一个文件夹
compressing.zip.compressDir('E:/test', 'E:/test.zip').then(func1).catch(func2);
// 同时压缩多个文件和文件夹,采用 stream 的方式
const zipStream = new compressing.zip.Stream();
zipStream.addEntry('./test');
zipStream.addEntry('./1.txt');
zipStream.pipe(fs.createWriteStream('./test1.zip')).on('finish', ()=>{
	console.log('压缩完成')
}).on('error', ()=>{
	console.log('压缩失败')
})

在使用compressing.zip.compressDir压缩整个文件夹的时候,会把最外层的文件夹也一起压缩,解压出来又是一个完整的文件夹。但是我的需求时只想把这个文件夹下的所有文件打包,直接解压出来得到零散的很多个文件。

最初的想法呢是通过 fs的API对文件夹进行遍历,用 addEntry 的方式打包,后来发现原来是可以设置参数的,只是文档中没有表现出来,而且写着:usually you don't need it ,导致我走了很多弯路。

后面在 addEntry 的接口文档中看到了有个 opt.ignoreBase 的参数,才想到 compressDir 是不是也可以用。于是尝试了一下,的确满足了我的需求,含泪删掉遍历文件夹的代码。

compressing.zip.compressDir('E:/test', 'E:/test.zip', {
	ignoreBase: true
})

基本上,一个解压和压缩的需求就可以完成了。可偏偏就遇到了个问题,在用 compressing 压缩成一个zip包之后,在某个特殊的系统中,用系统自带的解压出来,文件都变成文件夹了,比如 app.js 是个js文件,解压后变成一个名为 app.js 的文件夹。这就很尴尬了。

我尝试了compressDiraddEntry的方式,最终得到的结果都一样。于是乎,为了验证是这个系统本身解压算法的问题,我又找了另外一个压缩库。

archiver

archiver是一个在nodejs中能跨平台实现打包功能的模块,通过 stream 的方式,可以打zip和tar包。如果连这个打包之后在这个系统中解压出来的文件还是有问题的话,那我就可以认为是这个系统的问题,而不是我代码的问题。

const output = fs.createWriteStream('./test.zip');
const archive = archiver('zip', {zlib: {
	level: 9 // 设置压缩等级
}});
archive.pipe(output);
archive.directory('./test', false); // 这里false参数和上面的ignoreBase为true效果一样
archive.finalize();	// 完成压缩
archive.on('end', () => {	// 压缩结束时触发
	console.log('压缩完成');
});

本来想证明是这个系统本身存在问题,结果却狠狠打脸了。用 archiver 压缩后的 zip 包在这个系统中解压出来是正常的文件,那么真相就是 compressing 的压缩算法有点问题,只不过这个问题复现的场景很不一般,在正常的系统中都不会遇到。

不过呢,我想了又想,现在也只能算是一比一打平,为了科学的严谨性,我决定再找一个压缩库进行验证。

adm-zip

adm-zip 是一个支持zip压缩和解压缩的库,而我也只需要压缩zip格式包,刚好可以满足我的需求。

压缩

const admzip = new AdmZip();
// 压缩文件夹
admzip.addLocalFolder('./test');
// 压缩文件
admzip.addLocalFile('./1.txt');
admzip.writeZip('./test.zip');

addLocalFolder 压缩整个文件夹的时候,会把这个文件夹下的所有文件打包,直接解压出来得到零散的很多个文件,效果和compressDir设置参数ignoreBase为true一样。

addLocalFolder 支持第二个参数,可以将要压缩的文件,压缩进压缩包的某个路径下。

admzip.addLocalFolder('./test','aaa');
admzip.addLocalFolder('./test','aaa/bbb');

可以设置多级目录,解压出来后的文件就在这个目录里。

writeZip 是一个同步的方法,而上面两个库压缩都是异步的。在使用 adm-zip 打包之后,验证出来的效果和 archiver 是一样的,在那个特殊的系统上,解压都没有问题。这就真的证明了 compressing 真的存在小问题,不过在正常场景中应该都可以忽略不计。

解压缩

adm-zip 也支持解压缩。

const admzip = new AdmZip('./test.zip');
admzip.extractAllTo('./test'); // 把整个压缩包完全解压到 test 目录中

除了解压整个压缩包,还支持单独解压某个文件

const admzip = new AdmZip('./test.zip');
const entry = zip.getEntry('1.txt');
admzip.extractEntryTo(entry, './test2', true, true);

extractEntryTo 支持4个参数,第三个参数表示是否需要创建父文件夹,第四个参数表示是否要覆盖。

总结

经过多个库的使用和对比,发现 adm-zip 可以完美的解决我的需求,同时打包之后,体积也是最小的。在大部分的开发场景中,用哪个库其实都不会有问题的。compressing 可以支持更多的压缩格式,adm-zip只支持zip格式,archiver 却不支持解压缩,因此根据自己的应用场景选择最合适的库吧。

以上就是Node.js 应用探索文件解压缩示例详解的详细内容,更多关于Node.js 文件解压缩的资料请关注我们其它相关文章!

(0)

相关推荐

  • node.js读写json文件的方法

    本文实例为大家分享了node.js读写json文件的具体代码,供大家参考,具体内容如下 一.引入依赖包 const fs = require('fs') const path = require('path') const configFile = path.resolve(__dirname, './config.json') 二.读取文件 /** * 读取文件 * */ router.get('/get_config', async ctx => { try { const data = f

  • nodejs如何读取文件二进制 前端响应blob或base64显示图片

    目录 读取文件二进制 前端响应blob或base64显示图片 nodejs读取文件 createReadStream 读取文件二进制 前端响应blob或base64显示图片 express 框架 nodejs var express = require('express') var app = express(); var fs = require('fs') var http = require('http').createServer(app); app.get('/send',async

  • 关于node编写文件上传的接口的坑及解决

    目录 node编写文件上传接口的坑 在app.js引入,进行路由 node(express)图片上传接口写法 需要 步骤和代码 node编写文件上传接口的坑 今天没事在写node的接口时候用到文件上传的接口给前端,不知道用中间件好一点,然后就找度娘,网上都是koa-body中间件,但是那个自己测试老是接收不到传过来的文件file的值,然后换另一种就是koa-multer 完美解决. 首先是在这里插入代码片npm i koa-multer 在app.js引入,进行路由 控制器代码: 路由代码 然后

  • Vue+NodeJS实现大文件上传的示例代码

    目录 整体思路 项目演示 前端界面 文件切片 hash计算 查询切片状态 切片上传(断点续传) 文件总体上传进度 合并文件 优化 请求并发数控制 hash值计算优化 常见的文件上传方式可能就是new一个FormData,把文件append进去以后post给后端就可以了.但如果采用这种方式来上传大文件就很容易产生上传超时的问题,而且一旦失败还得从新开始,在漫长的等待过程中用户还不能刷新浏览器,不然前功尽弃.因此这类问题一般都是通过切片上传. 整体思路 将文件切成多个小文件 hash计算,需要计算一

  • nodejs中的读取文件fs与文件路径path解析

    目录 什么是nodejs? global模块-全局变量 fs模块 读取文件 写文件 追加文件 文件同步与异步的说明 path模块 路径操作的问题 path模块的常用方法 什么是nodejs? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,nodejs允许javascript代码运行在服务端 1. nodejs不是一门新的编程语言,nodejs是在服务端运行javascript的运行环境 2. 运行环境:写得程序想要运行必须要有对应的运行环境 php代码必

  • Node.js 应用探索文件解压缩示例详解

    目录 引言 compressing 解压 压缩 archiver adm-zip 压缩 解压缩 总结 引言 今天在使用 node 脚本对文件处理时,需要实现一个功能,要对一个 zip 压缩包解压出来,修改里面的文件后,重新打包成zip包.node 解压缩文件的场景在实际应用中还是比较常见,下面介绍几个用来解压缩文件的库和使用方法. compressing compressing 是一个使用起来方便.功能非常强大的node库,它可以对文件.文件夹进行解压或压缩,支持tar.gzip.tgz.zip

  • .NetCore实现上传多文件的示例详解

    本章和大家分享的是.NetCore的MVC框架上传文件的示例,主要讲的内容有:form方式提交上传,ajax上传,ajax提交+上传进度效果,Task并行处理+ajax提交+上传进度,相信当你读完文章内容后能后好的收获,如果可以不妨点个赞:由于昨天电脑没电了,快要写完的内容没有保存,今天早上提前来公司从头开始重新,断电这情况的确让人很头痛啊,不过为了社区的分享环境,这也是值得的,不多说了来进入今天的正篇环节吧: form方式上传一组图片 先来看看咋们html的代码,这里先简单说下要上传文件必须要

  • Node.js 条形码识别程序构建思路详解

    在这篇文章中,我们将展示一个非常简单的方法构建一个自定义的 Node 模块,该模块封装了Dynamsoft Barcode Reader SDK ,支持 Windows.Linux 和 OS X,同时我们将演示如何集成这块模块实现一个在线的条形码读取应用. 越来越多的 Web 开发者选择 Node 来构建网站,因为使用 JavaScript 来开发复杂的服务器端 Web 应用越来越便利.为了扩展在不同平台下的 Node 的功能,Node 允许开发者使用 C/C++ 来创建扩展. 介绍 Dynam

  • Node.Js中实现端口重用原理详解

    本文介绍了Node.Js中实现端口重用原理详解,分享给大家,具体如下: 起源,从官方实例中看多进程共用端口 const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); for (let i =

  • Node.js完整实现博客系统详解

    目录 一.项目功能说明 二.最终效果 三.文件目录结构说明 四.项目技术栈 五.核心技术 1. 使用Schema定义数据模型 2. mongoose 的操作 3. mogodb数据库的操作 4. 使用第三方插件 express-session:存取数据状态 5. 挂载路由 6. 使用md5对密码进行加密 六.遇到的问题 七.github链接 一.项目功能说明 登录.注册 新建博客 首页显示全部博客 查看博客详情页 查看博客评论区 修改.删除博客 二.最终效果 首页: 登录.注册: 详情页: 评论

  • Xterm.js入门官方文档示例详解

    目录 前言 xterm.js是什么? 安装 初始化 使用插件 API文档模块 类 Terminal 构造函数 constructor 接口 插件 attach插件 前后端示例 结语 前言 入职的新公司所在的事业部专注于K12的编程教育.公司项目里有使用xterm.js这个库, 并基于master分支做出了一定的修改.为了尽快的熟悉业务以及公司的代码, 所以这里打算学习xterm.js的文档(粗略的翻译, 方便自己查阅, 凡是保留原文的地方, 是我目前还没有明白具体使用场景和用法的地方) xter

  • C++中#include头文件的示例详解

    fstream是C++ STL中对文件操作的合集,包含了常用的所有文件操作.在C++中,所有的文件操作,都是以流(stream)的方式进行的,fstream也就是文件流file stream. 最常用的两种操作为: 1.插入器(<<) 向流输出数据.比如说打开了一个文件流fout,那么调用fout<<"Write to file"<<endl;就表示把字符串"Write to file"写入文件并换行. 2.析取器(>>

  • Go语言基础Json序列化反序列化及文件读写示例详解

    目录 概述 JSON序列化 结构体转JSON map转JSON 切片转JSON JSON反序列化 JSON转map JSON转结构体 JSON转切片 写JSON文件 map写入JSON文件 切片写入JSON文件 结构体写入JSON文件 读JSON文件 解码JSON文件为map 解码JSON文件为切片 解码JSON文件为结构体 示例 概述 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的.键值对的数据交换格式.结构由大括号'{}',中括

  • Vue.js实现watch属性的示例详解

    目录 1.写在前面 2.watch的实现原理 3.立即执行的watch与回调执行时机 立即执行的回调函数 回调函数的执行时机 4.过期的副作用函数和cleanup 5.写在最后 1.写在前面 在上篇文章中,我们讨论了compted的实现原理,就是利用effect和options参数进行封装.同样的,watch也是基于此进行封装的,当然watch还可以传递第三参数去清理过期的副作用函数.不仅可以利用副作用函数的调度性,去实现回调函数的立即执行,也可以控制回调函数的执行时机. 2.watch的实现原

  • JS代码计算LocalStorage容量示例详解

    目录 LocalStorage 容量 计算总容量 已使用容量 剩余可用容量 LocalStorage 容量 localStorage的容量大家都知道是5M,但是却很少人知道怎么去验证,而且某些场景需要计算localStorage的剩余容量时,就需要我们掌握计算容量的技能了~~ 计算总容量 我们以10KB一个单位,也就是10240B,1024B就是10240个字节的大小,我们不断往localStorage中累加存入10KB,等到超出最大存储时,会报错,那个时候统计出所有累积的大小,就是总存储量了!

随机推荐