首页 > 编程语言 >node环境中jszip插件的使用

node环境中jszip插件的使用

时间:2022-10-26 10:26:04浏览次数:45  
标签:node 插件 const string await jszip dirPath handle targetPath

import JSZip from 'jszip';
import { extname, join, relative, sep, dirname } from 'path';
import { pathExists, Stats, stat, readdir, readFile, writeFile, ensureDir } from 'fs-extra';

/**
 * 递归文件执行回调函数
 * @param dirPath
 * @param handle
 * @returns
 */
const recursive = async (
    dirPath: string,
    handle: (file: string, ext: string, stat: Stats) => Promise<void>,
): Promise<void> => {
    if (!(await pathExists(dirPath))) return; // 如果路径不存在,直接返回

    const fileStats: Stats = await stat(dirPath);

    if (fileStats.isSymbolicLink()) return; // 如果是软链接,那么就直接跳过

    if (fileStats.isDirectory()) {
        const fileList = await readdir(dirPath, { withFileTypes: true });

        for (let i = 0, len = fileList.length; i < len; i++) {
            const temp = fileList[i];

            await recursive(join(dirPath, temp.name), handle);
        }
    } else if (fileStats.isFile()) {
        // 如果不存在需要过滤的,或者匹配上过虑的,那么执行回调
        await handle(dirPath, extname(dirPath), fileStats);
    }
};

/**
 * 实现文件压缩
 * @param {string} targetPath 目标路径
 * @param {string} destPath  压缩后的路径
 * @param {number} level 压缩等级
 */
export const zip = async (
    targetPath: string,
    destPath: string,
    level: number = 1,
): Promise<void> => {
    if (!(await pathExists(targetPath))) throw new Error('Zip requires a valid address');

    const zipHandle = new JSZip();
    // const folderName = basename(targetPath);

    await recursive(targetPath, async (file: string) => {
        const fileContent = await readFile(file);

        zipHandle
            // .folder(folderName)  //外面不需要再包一层文件夹
            ?.file(relative(targetPath, file).split(sep).join('/'), fileContent);
    });

    const buffer = await zipHandle.generateAsync({
        type: 'nodebuffer',
        compression: 'DEFLATE',
        compressionOptions: { level },
    });

    await writeFile(destPath, buffer);
};

/**
 * 实现zip文件解压
 * @param {string} targetPath 源文件地址
 * @param {string} destPath 目标地址
 */
export const unzip = async (targetPath: string, destPath: string): Promise<void> => {
    if (!(await pathExists(targetPath))) throw new Error('zip path is invalid');

    const zipHandle = new JSZip();

    const buffer = await readFile(targetPath);

    const handle: JSZip = await zipHandle.loadAsync(buffer, { createFolders: false });
    const { files } = handle;
    const keys = Object.keys(files);

    for (let i = 0, len = keys.length; i < len; i++) {
        const temp = join(destPath, keys[i]);
        await ensureDir(dirname(temp));

        if (!handle.files[keys[i]].dir) {
            const content = await handle.files[keys[i]].async('nodebuffer');

            await writeFile(temp, content);
        }
    }
};

 

标签:node,插件,const,string,await,jszip,dirPath,handle,targetPath
From: https://www.cnblogs.com/venblogs/p/16827330.html

相关文章

  • K8s nodePort、port、targetPort、hostPort
    转载:https://blog.csdn.net/chainsmoker_/article/details/1244498901.nodePort外部流量访问k8s集群中service入口的一种方式(另一种方式是LoadBalancer),即nodeIP:nodeP......
  • chrome插件 vue-devtools zip 编译
    背景,工程代码在内网无法联网百度等,需要离线安装该工具开发vuejs工程 一、从有网络的地方拷贝插件xxxxx.crx,觉得这种比较合理注意,网上说的从chrome://extensions/查看......
  • 快速启动prometheus node-exporter
    文档说明:只记录关键地方;试验环境:linuxdebian11node-exporterversion:"3"services:node-export:image:prom/node-exporter:latestnetwork......
  • dedecms v5.7-ckeditor3x插件包整合
    ​ wordpaster-dedecms(织梦CMS)v5.7插件包发布 插件包是已经修改好的文件集合。您可以直接将插件包复制到您的网站中。注意:插件包会替换您的编辑器文件,如果您自已修......
  • 1. 注册Aegisub插件
    1注册Register注:本系列不包括lua基础,您需要掌握基础的Aegisub模板编写能力以及掌握基础的Lua知识后进行学习1.1注册aegisub.register_macro(name,description,ma......
  • idea插件PlantUML简介-类图
    1、安装PlantUML2、安装GraphvizbrewinstallGraphviz3、uml类图用法4、文档下载@startumltitleuml类图用法/'+表示public-表示privat......
  • 【异常处理】node-retry 断网等异常重试
    https://github.com/tim-kos/node-retry (npminstallretry) constretry=require('retry')constdelay=require('delay')constisItGood=[false,false,tr......
  • 常用git插件
    Chinese(Simplified)(简体中文)LanguagePackforVisualStudioCodeGitHistoryGitLensImagepreviewNGA-MoFishPowerModeQQTailwindCSSIntelliSenseuni-......
  • Node.js安装详细步骤教程(Windows版)
    什么是Node.js?简单的说Node.js就是运行在服务端的JavaScript。Node.js是一个基于ChromeV8引擎的JavaScript运行环境;Node.js使用一个事件驱动、非阻塞式I/O的......
  • 通过Nvm修改node版本
     之前用的node版本是16.16.0,可能是node版本太高了,搞定不了两年前的项目,只能用和插件适应的14.版本。   先说一下大体的思路:  1、卸载原本的nodejs  2、......