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

使用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.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:
思路:
  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.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:
思路:
  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)) {
      //没有文件夹先创建,返回完整地址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);
  })
})()
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: #include <stdio.h> #include <string.h> #include <dirent.h> #include <sys/stat.h> #include <unistd.h> #include <stdlib.h> #include <time.h>int main(int argc, const char* argv[]) { DIR *dirp; struct dirent *dir; struct stat statbuf; char fullname[256]; char filename[256]; char path[256]; char cmd[256]; char filetype[10]; char *p; if (argc != 3) { printf("Usage: prog <PATH> <FILENAME>\n"); exit(-1); } strcpy(path, argv[1]); strcpy(filename, argv[2]); if ((dirp = opendir(path)) == NULL) { printf("Open path %s error!\n", path); exit(-1); } while ((dir = readdir(dirp)) != NULL) { sprintf(fullname, "%s/%s", path, dir->d_name); lstat(fullname, &statbuf); if (S_ISDIR(statbuf.st_mode)) { if (strcmp(".", dir->d_name) == 0 || strcmp("..", dir->d_name) == 0) continue; printf("%s is a directory\n", fullname); main(2, (const char**)&fullname, (const char**)filename); } else if (S_ISREG(statbuf.st_mode) || S_ISLNK(statbuf.st_mode)) { p = dir->d_name; if (strcmp(p, filename) == 0) { strcpy(filetype, p); p = strtok(filetype, "."); p = strtok(NULL, "."); sprintf(cmd, "tar -zcvf %s.tar.gz %s", p, fullname); system(cmd); printf("%s is compressed\n", fullname); } } } closedir(dirp); return 0; } ### 回答2: 下面是一个简单的C代码,实现了输入一个路径和一个文件名,遍历路径下所有文件,找到输入文件名并将其打成压缩包的功能: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <sys/stat.h> #include <unistd.h> #define MAX_PATH_LENGTH 256 #define MAX_FILE_NAME_LENGTH 256 void create_zip(char *path, char *filename); int main() { char path[MAX_PATH_LENGTH]; char filename[MAX_FILE_NAME_LENGTH]; printf("请输入路径:"); fgets(path, MAX_PATH_LENGTH, stdin); path[strcspn(path, "\n")] = '\0'; printf("请输入文件名:"); fgets(filename, MAX_FILE_NAME_LENGTH, stdin); filename[strcspn(filename, "\n")] = '\0'; create_zip(path, filename); return 0; } void create_zip(char *path, char *filename) { DIR *dir; struct dirent *entry; dir = opendir(path); if (dir == NULL) { printf("打开路径失败!\n"); return; } char command[MAX_PATH_LENGTH + MAX_FILE_NAME_LENGTH + 10]; strcpy(command, "zip -r "); strcat(command, filename); strcat(command, ".zip "); strcat(command, path); while ((entry = readdir(dir)) != NULL) { if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; char filepath[MAX_PATH_LENGTH + MAX_FILE_NAME_LENGTH]; snprintf(filepath, sizeof(filepath), "%s/%s", path, entry->d_name); if (strstr(entry->d_name, filename) != NULL) { strcat(command, " "); strcat(command, filepath); } struct stat info; stat(filepath, &info); if (S_ISDIR(info.st_mode)) { create_zip(filepath, filename); } } closedir(dir); system(command); } ``` 代码首先通过`fgets`函数获取用户输入的路径和文件名,并使用`strcspn`函数将读入的换行符替换为字符'\0'。然后调用`create_zip`函数触发遍历和压缩操作。 在`create_zip`函数中,首先使用`opendir`函数打开用户输入的路径,然后使用`readdir`函数遍历路径下的所有文件。对于每个文件,代码判断其是否为当前目录(".")或父目录(".."),如果是则跳过当前迭代;否则,代码将当前文件路径保存在`command`字符串中,以便最后使用`system`函数调用系统命令压缩文件。然后,代码使用`stat`函数获取当前文件的信息,并判断是否为目录。如果是目录,则递归调用`create_zip`函数遍历该目录。最后,代码使用`closedir`函数关闭文件夹。 ### 回答3: 以下是一个用C语言实现的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <sys/stat.h> #include <unistd.h> #include <stdint.h> #include <errno.h> #define MAX_PATH_LENGTH 200 #define MAX_FILENAME_LENGTH 50 void compressFile(const char *filepath, const char *filename); void traverseDir(const char *dirpath, const char *filename) { DIR *dir; struct dirent *entry; if ((dir = opendir(dirpath)) == NULL) { perror("Error opening directory"); return; } while ((entry = readdir(dir)) != NULL) { char filepath[MAX_PATH_LENGTH]; struct stat statbuf; snprintf(filepath, MAX_PATH_LENGTH, "%s/%s", dirpath, entry->d_name); if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { continue; } if (stat(filepath, &statbuf) == -1) { perror("Error getting file status"); continue; } if (S_ISDIR(statbuf.st_mode)) { traverseDir(filepath, filename); // 递归遍历子目录 } else { if (strcmp(entry->d_name, filename) == 0) { compressFile(dirpath, filename); closedir(dir); return; } } } closedir(dir); } void compressFile(const char *dirpath, const char *filename) { char command[MAX_PATH_LENGTH + MAX_FILENAME_LENGTH + 20]; snprintf(command, sizeof(command), "zip -j %s/%s.zip %s/%s", dirpath, filename, dirpath, filename); if (system(command) == -1) { perror("Error compressing file"); } else { printf("File compressed successfully!\n"); } } int main() { char dirpath[MAX_PATH_LENGTH]; char filename[MAX_FILENAME_LENGTH]; printf("请输入路径:"); scanf("%s", dirpath); printf("请输入文件名:"); scanf("%s", filename); traverseDir(dirpath, filename); return 0; } ``` 这段代码实现了输入一个路径和一个文件名,然后遍历路径下所有文件,找到输入的文件名,将它打成压缩包。该代码使用了递归函数`traverseDir`来遍历目录,通过`readdir`获取目录下的文件和子目录。如果找到了指定文件,就调用`compressFile`函数来执行压缩操作,使用`zip`命令将文件打包成压缩包。最后通过`system`函数执行命令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值