使用jszip解压文件与compressing解压zip文件到指定目录

一、介绍jszip和compressing模块

jszip和compressing模块都是可以压缩和解压缩zip文件,都可以通过npm直接下载模块。

  • compressing

    1. 支持解压的文件类型更多,目前支持zip、tar、gzip、tgz。
    2. npm官网的案例写的很明白: compressing案例
    3. 可以直接找到压缩包所在目录,解压到指定目录,很方便
  • jszip
    1. 下载量惊人
    2. 跨平台
    3. 仅支持zip
    4. 官网例子有点少,方法名很简略有点云里雾里,但是要努力克服 jszip案例

二、使用jszip和compressing模块

2.1 这里我给出我的3个不同需求,分别在下面解决:

1. 我想将一个目录A下的压缩包解压到指定目录B。
2. 我想将一个目录A下的压缩包解压替换指定目录B的文件目录。
3. 我想从链接请求到压缩包,将压缩包替换指定目录B的文件目录。

2.2添加node脚本

  1. package.json文件中的script中添加"指令名": "node 文件名A.js"
"handler:gojs": "node gojsHandler.js"
  1. 在项目根目录中创建gojsHandler.js(文件名A)文件。
  2. 如果项目使用typescript,取消检查可在文件最上面添加以下注释:
/* eslint-disable no-undef */
/* eslint-disable @typescript-eslint/no-var-requires */
  1. 完成以下任意需求代码。
  2. 运行npm run 指令名npm run handler:gojs

2.3需求解决

需求1:

思路:
  1. 安装:npm i compressing
  2. 使用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.zipcompressing.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:

思路:
  1. 安装:npm i compressing
  2. 删除指定目录B的文件目录。
  3. 使用compressing的一个方法直接找到指定目录A,解压到指定目录B。
注意事项:
  1. 解决删除和解压的先后顺序不清楚问题,使用promise。
  2. 删除前需要判断文件夹是否存在。要检查文件是否存在而不对文件进行操作,建议使用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.zipcompressing.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:

思路:
  1. 安装:npm i jszipnpm i axios
  2. axios.get获取到压缩包文件。
  3. 删除指定目录B的文件目录。
  4. 使用 jszip 解压文件获取文件信息。
  5. 将文件存到指定目录B中,遍历判断是否文件存在是否是文件夹,创建文件目录,创建文件。
注意事项:
  1. axios自己使用的就是promise,获取到文件就行。
  2. 解决删除和解压的先后顺序不清楚问题,使用promise。
  3. 删除前需要判断文件夹是否存在。要检查文件是否存在而不对文件进行操作,建议使用fs.access()
  4. 想要实现文件夹不存在时创建文件夹,但是如果文件不存在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)) {//没有文件夹先创建,返回完整地址destconst 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);})
})()

(压缩包在本地目录或由链接请求)使用jszip解压文件或compressing解压文件到指定目录,写个node脚本相关推荐

  1. python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏。 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小

    python 实现统计ftp服务器指定目录下文件夹数目.文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏. 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小,类 ...

  2. 如何把C盘里的文件默认位置更改到D盘指定目录?

    如何把C盘里的文件默认位置更改到D盘指定目录? 1.打开运行,输入 %HOMEPATH% 2.以"桌面"文件转移到D盘目录为例(其他文档类比进行操作) 3.鼠标右键"桌面 ...

  3. 将linux目录中的特定文件推送到手机_linux复制指定目录下的全部文件到另一个目录中,linux cp 文件夹...

    linux复制指定目录下的全部文件到另一个目录中 复制指定目录下的全部文件到另一个目录中 文件及目录的复制是经常要用到的.linux下进行复制的命令为cp. 假设复制源目录 为 dir1 ,目标目录为 ...

  4. c# 遍历文件夹深度_C#.NET中遍历指定目录下的文件(及所有子目录及子目录里更深层目录里的文件)...

    //遍历一个目录下所有的文件列表,代码实例 DirectoryInfo dir = new DirectoryInfo(folderName); var list = GetAll(dir); /// ...

  5. php删除目录文件内容,php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码...

    搜索热词 web 开发中我们可能会碰到需要将某个目录下的所有文件清空,但不删除这个目录下的子目录(当然也不会删除被删除的根目录)的情况.那么对于这种只删除文件而不删除目录的方法,你是如何处理的呢?下面 ...

  6. Linux 删除指定目录下的文件/删除文件

    文章目录 删除当前目录下的所有类型的文件 删除指定目录下的所有类型的文件 用 find 命令在当前目录下查找普通文件并删除 用 find 命令在指定目录下查找普通文件并删除 用 find 命令的处理动 ...

  7. Java 文件操作二(重命名、设置只读、是否存在、指定目录中创建文件、获取文件修改日期、创建文件、文件路径比较)

    文件重命名 import java.io.File;public class Main {public static void main(String[] args) {File oldName = ...

  8. Python_删除/创建指定目录及其下所有子目录的文件,该文件记录当前文件夹的内容...

    Python_删除/创建指定目录及其下所有子目录的文件,该文件记录当前文件夹的内容 Python_删除/创建指定目录及其下所有子目录的文件,该文件记录当前文件夹的内容 - IGod接口 - 博客园 P ...

  9. Java实现指定目录下的文件查找

    Java实现指定目录下的文件查找 入门Java实现文件的查找功能较为简单,主要有以下两种: 1.给出文件名,查找目录及其子目录中是否存在 2.给出后缀名,查找目录及其子目录中相关的文件 题型一: 题目 ...

最新文章

  1. Michael A. Cusumano
  2. 中国和英国的在学生创业环境上的区别
  3. linux python wps doc 转 txt_耗时一周尝试踩坑,整理了一些Python实用知识点
  4. 即时通讯软件测试方法,Linux系统环境下如何使用aMsn即时通讯
  5. 如何修改新浪微博对其他应用的授权
  6. sp.net MVCJQuery 应用(表单验证)
  7. MFC DLL向导(二)
  8. linux下main函数的返回值问题
  9. sql server 2008完全卸载工具
  10. 我的世界服务器怎么做无限的弓,我的世界怎么用命令方块做无限弓?
  11. HCIP——IPv6地址基础
  12. 2022-2028全球与中国侧装车载摄像头市场现状及未来发展趋势
  13. mezzanine安装和使用
  14. adb不是内部命令和sudo: adb: command not found
  15. python 推箱子实验开发报告,python实现推箱子游戏
  16. 尘埃粒子计数器帮助实时监测半导体车间空气中的粒子数
  17. mac桌面壁纸_在Mac上从命令行设置桌面墙纸
  18. 面试题目总结(CNN)
  19. 工作3年,看啥资料能月薪30K?
  20. input框不能输入

热门文章

  1. 基于 React video 视频打点
  2. 学籍信息管理系统c语言编程,学生学籍信息管理系统C语言设计.doc
  3. 立体五子棋中的一个有趣的bug
  4. ffmpeg学习日记604-指令-将视频格式转为H264格式
  5. 群晖NAS教程(十七)、利用Docker安装网心云容器魔方
  6. 华为的android文件夹在哪,安卓手机文件目录详解
  7. 《Linux系统调用:opendir,readdir,closedir,rewinddir》
  8. 关于单片机IO口输入输出的理解!
  9. 使用C++计算3次牛顿插值法
  10. ## Django项目命令启动