使用jszip解压文件与compressing解压zip文件到指定目录
一、介绍jszip和compressing模块
jszip和compressing模块都是可以压缩和解压缩zip文件,都可以通过npm直接下载模块。
- compressing
- 支持解压的文件类型更多,目前支持zip、tar、gzip、tgz。
- npm官网的案例写的很明白: compressing案例
- 可以直接找到压缩包所在目录,解压到指定目录,很方便
- jszip
- 下载量惊人
- 跨平台
- 仅支持zip
- 官网例子有点少,方法名很简略有点云里雾里,但是要努力克服 jszip案例
二、使用jszip和compressing模块
2.1 这里我给出我的3个不同需求,分别在下面解决:
1. 我想将一个目录A下的压缩包解压到指定目录B。
2. 我想将一个目录A下的压缩包解压替换指定目录B的文件目录。
3. 我想从链接请求到压缩包,将压缩包替换指定目录B的文件目录。
2.2添加node脚本
- 在
package.json
文件中的script
中添加"指令名": "node 文件名A.js"
"handler:gojs": "node gojsHandler.js"
- 在项目根目录中创建
gojsHandler.js
(文件名A)文件。 - 如果项目使用typescript,取消检查可在文件最上面添加以下注释:
/* eslint-disable no-undef */
/* eslint-disable @typescript-eslint/no-var-requires */
- 完成以下任意需求代码。
- 运行
npm run 指令名
:npm run handler:gojs
2.3需求解决
需求1:
思路:
- 安装:
npm i compressing
- 使用compressing的一个方法直接找到指定目录A,解压到指定目录B。
实现代码:
const compressing = require('compressing');
const projectDir = __dirname;
//解压函数
/**
* fileName:压缩文件相对项目目录的路径,`${projectDir}/${fileName}`是完整的压缩包路径
* mbDir:目标目录B,想要解压到的位置
*/
function unzipSync(fileName,mbDir){
return new Promise((resolve,reject)=>{
//解压gojs.zip
compressing.zip.uncompress(`${projectDir}/${fileName}`, mbDir).then((res) => {
resolve('成功解压到node_modules');
}).catch(() => {
reject('解压失败');
});
})
}
//执行
(function(){
unzipSync('gojs.zip',__dirname+'/node_modules').then(res=>{
console.log(res);
}).catch(err=>{
console.log(err);
})
})()
需求2:
思路:
- 安装:
npm i compressing
- 删除指定目录B的文件目录。
- 使用compressing的一个方法直接找到指定目录A,解压到指定目录B。
注意事项:
- 解决删除和解压的先后顺序不清楚问题,使用promise。
- 删除前需要判断文件夹是否存在。要检查文件是否存在而不对文件进行操作,建议使用
fs.access()
实现代码:
const fs = require('fs');
//删除文件
/**
* fileDir:要删除文件的指定目录B
*/
function delFilesSync(fileDir){
return new Promise((resolve,reject)=>{
//1.判断gojs文件夹是否存在
fs.access(fileDir,fs.constants.F_OK, (err) => {
if(!err){
//2.删除gojs文件夹。要检查文件是否存在而不对文件进行操作,建议使用fs.access()
fs.rmdir(fileDir,{recursive : true},err=>{
if (err) {
reject('删除gojs文件失败'+err);
}else {
resolve('删除gojs文件成功')
}
})
}else{
resolve(`${fileDir}文件不存在,不需删除`)
}
});
})
}
//解压函数
function unzipSync(fileName,mbDir){
return new Promise((resolve,reject)=>{
//3.解压gojs.zip
compressing.zip.uncompress(`${projectDir}/${fileName}`, mbDir).then((res) => {
resolve('成功解压到node_modules');
}).catch(() => {
reject('解压失败');
});
})
}
//执行
(function(){
//删除
delFilesSync(gojsDir).then(res=>{
console.log(res);
//解压到指定文件目录
unzipSync('gojs.zip',__dirname+'/node_modules').then(res=>{
console.log(res);
}).catch(err=>{
console.log(err);
})
}).catch(err=>{
console.log(err);
})
})()
需求3:
思路:
- 安装:
npm i jszip
和npm i axios
。 axios.get
获取到压缩包文件。- 删除指定目录B的文件目录。
- 使用 jszip 解压文件获取文件信息。
- 将文件存到指定目录B中,遍历判断是否文件存在是否是文件夹,创建文件目录,创建文件。
注意事项:
- axios自己使用的就是promise,获取到文件就行。
- 解决删除和解压的先后顺序不清楚问题,使用promise。
- 删除前需要判断文件夹是否存在。要检查文件是否存在而不对文件进行操作,建议使用
fs.access()
。 - 想要实现文件夹不存在时创建文件夹,但是如果文件不存在fs.statSyn就会报错。可以使用try包裹,在接收到
fs.statSyn
报错时即文件不存在,返回false,可创建
实现代码:
/* eslint-disable no-undef */
/* eslint-disable @typescript-eslint/no-var-requires */
const { default: axios } = require('axios');
const fs = require('fs');
const JSZip = require('jszip');
const path = require('path');
const gojsDir = __dirname+'/node_modules/gojs';
// let zip = new JSZip();
//axios请求压缩包
function getZipFiles(zipUrl) {
return new Promise((resolve,reject)=>{
axios.get(zipUrl,{
method:'get',
url:zipUrl,
responseType:'arraybuffer'// 类型必须为arraybuffer,loadAsync加载其他类型资源会出问题,比如资源乱码
}).then(res=>{
//解压
JSZip.loadAsync(res.data).then(res=>{
resolve({msg:'解压成功',files:res.files});
}).catch(err=>{
reject('解压失败!'+err)
})
}).catch(err=>{
reject('数据请求失败!'+err);
})
})
}
//是否是文件夹
/**
* 想要实现文件夹不存在时创建文件夹,但是如果文件不存在fs.statSyn就会报错
* fs.statSyn返回的就是stat实例,也就是文件信息,stat在获取文件信息时,文件不存在就会报错
* 那么使用try包裹,接收到错误时即文件不存在,返回false,可创建
*/
function isDirSync(curPath){
try{
const stat = fs.statSync(curPath);
return stat.isDirectory() //是否是文件夹
}catch(err){
return false; //文件不存在
}
}
//保存解压的文件
function saveZipFiles(files,savePath) { // 获取解压后的文件
try {
for (const filename of Object.keys(files)) {
//没有文件夹先创建,返回完整地址dest
const dest = path.join(__dirname, savePath, filename);
// console.log(files[filename].dir && !isDirSync(dest));
if (files[filename].dir && !isDirSync(dest)) {
//满足创建文件夹的条件
fs.mkdirSync(dest, {
recursive: true
});
} else {
files[filename].async('nodebuffer').then(content => fs.writeFileSync(dest, content));
}
}
} catch (error) {
console.error('保存解压文件失败!', error.message);
return error;
}
}
//删除文件
function delFilesSync(fileDir){
return new Promise((resolve,reject)=>{
//1.判断gojs文件夹是否存在
fs.access(fileDir,fs.constants.F_OK, (err) => {
if(!err){
//2.删除gojs文件夹
fs.rmdir(fileDir,{recursive : true},err=>{
if (err) {
reject('删除gojs文件失败'+err);
}else {
resolve('删除gojs文件成功')
}
})
}else{
resolve(`${fileDir}文件不存在,不需删除`)
}
});
})
}
//jszip
(function(){
delFilesSync(gojsDir).then(res=>{
console.log(res);
//获取解压文件
getZipFiles('这里写要下载zip的链接').then(res=>{
console.log(res.msg);
//保存解压文件
const files = res.files;
saveZipFiles(files,'/node_modules')
}).catch(err=>{
console.log(err);
})
}).catch(err=>{
console.log(err);
})
})()