背景

由于公司的CMS系统里,只接受rar格式压缩的文件,所以没法直接使用nodejs里提供的zip压缩组件。只能从winRar软件入手了,但网上没有多少这方面相关的东西,所以下面也是自己尝试着在做。

github地址:https://github.com/cedrusweng/win-rar

主要解决的几个问题

rar软件的位置获取问题

通过node的命令行组件child_process,运行注册表查询命令REG query ‘键值名’,可以查找出相关软件的目录,然后使用正则表达式对结果进行匹配,返回软件目录。命令如下:

var cp=require('child_process');

cp.exec("reg query HKEY_CLASSES_ROOT\\WinRAR\\shell\\open\\command /ve", function(e, stdout, stderr) {
if(!e){
var str = stdout.match(/\"([^\"]+)\"/)[0];
if(str){
console.log('已经找到winRar程序,详细地址为:'+str); }else{
console.log('没有找到winRar程序,无法完成压缩功能!');
}
}
});

通过上面的命令可以获取到注册表中winRar程序的绝对路径,如果你安装正确应该获得下面这个结果

环境变量设置问题

通过上面一步可以解决winRar软件的路径问题,但怎么才能方便地调用rar命令呢?我的第一个想法就是设置环境变量。通过运行命令行命令set path=%path%;新目录,node命令如下:

cp.exec("set path=%path%"+";c:\\", function(e, stdout, stderr) {
if(!e){
console.log("环境变量path添加;c:\\成功!")
}
});

获取结果如下

到这里好像没有问题。其实这里存在一个问题,这个环境变量设置是临时的,在命令行关闭时这个环境变量就消失了。

无法在下一次调用命令行时使用,所以到这里来说,无法再进行下去了。

在调用的过程中,设置环境变量和运行命令是两个步骤:

cp.exec("set path=%path%"+";c:\\", function(e, stdout, stderr) {
if(!e){
console.log("环境变量path添加;c:\\成功!");
cp.exec('rar a -r f:/build/1.rar f:/xc/gulpfile.js',{encoding:'binary'},function(e,stin,stout){
console.log(e,stin,stout);
});
}
});

下面的方法运行并不能得到正确的结果。

直接调用winRar程序

解决方法有两种,一种是笨方法,让每个使用者,手动去配置环境变量。第二种是直接在命令行使用完整的程序路径调用。

第一种方法,是最后的一步,实在不行才用这个方法,手动毕竟不是程序员该干的事。

第二种方法,测试可以使用,运行以下代码,

cp.exec('"C:\\Program Files\\WinRAR\\WinRAR.exe" a -r f:/build/1.rar f:/xc/gulpfile.js',{encoding:'binary'});

将得到以下结果

这里需要注意的是当路径中有空格的时候,可以把整个路径用引号包起来,不然会导致命令行命令运行失败。

但这里必须忍受,下面这个窗口。

一些扩展

1、在压缩的过程中,会包含上级文件夹,如何去压缩只包含文件不包含文件夹的,压缩包形如下面的图示

2、对文件目录包含的内容进行过滤,并对需要的文件及子文件夹进行压缩,如文件目录如下,我只想压缩里面的htm,txt文件。

可以通过node的fs组件,然后调用fs.readdirSync()方法,然后对得到的数组进行过滤。

需要注意的问题

1、程序运行路径中有空格时,别忘记用引号把路径包上,以及对符号进行转义。

2、在调用rar压缩文件时,当过滤掉的目录中含有和当前目录相同文件名的文件时,也会把子目录对应的文件压缩进来。(见补充代码)

在文件结构如下

运行下面的命令

cp.exec('"C:\\Program Files\\WinRAR\\WinRAR.exe" a -r f:/build/1.rar f:/xc/gulp.js',{encoding:'binary'});

虽然在本目录下没有对应的文件,但rar程序会自动,遍历子文件夹,最后生成如下的压缩包

因为这个组件文件夹里包含gulp.js文件。这会使上面的过滤出现问题,我还没解决,还没想到办法。

总结

基本上面的功能都完成了,只是构建工具里的一小部分,完成对源文件合并,压缩,md5后,添加的一个小功能。后面还会找一资料看一下,怎么解决上面的问题。在这里哪位大侠有解决办法,可以评论或私信,非常感谢。

附录一:winRar命令

配置完,winRar的环境变量,直接运行 rar,可以得到下面这些个列表

使用示例:

rar a contact.rar contact.dat

如果contact.rar不存在将创建contact.rar文件;如果contact.rar压缩包中已有contact.ext,将更新压缩包中的contact.ext

rar a -r -v2000 -sfx vudroid2.rar vudroid2

递归压缩vudroid2目录下全部文件为 2M 大小分卷自解压文件(自解压文件就是压缩文件中已经包含了解压缩的工具,无需用户自己安装解压缩工具) vudroid2.part1.sfx,vudroid2.part2.rar,vudroid2.part3.rar 等,将命令a换成命令m可将文件压缩后删除

rar x contact.rar

用绝对路径来解压,如果是rar x contact.rar ~/hehe/,前提是hehe文件夹要存在。就是解压到当前路径的hehe目录下,还有一个是e参数,解释是加压到当前目录下,在ubuntu 10.04我实验过,rar e和rar x都可以用相对路径和绝对路径解压,这一点我也不知道是为什么

rar a -pzaba contact1.rar contact.dat

使用密码 zaba 压缩contact1.rar文件

附录二:node的child_process组件

child_process.exec(command, [options], callback)   来源:《Node.js v4.2.4 手册 & 文档-child_process

  • command {String} 将要执行的命令,用空格分隔参数
  • options {Object}
    • cwd {String} 子进程的当前工作目录
    • env {Object} 环境变量键值对
    • encoding {String} 编码(缺省为 'utf8')
    • shell {String} 运行命令的 shell(UNIX 上缺省为 '/bin/sh',Windows 上缺省为 'cmd.exe'。该 shell 在 UNIX 上应当接受 -c 开关,在 Windows 上应当接受 /s /c 开关。在 Windows 中,命令行解析应当兼容 cmd.exe。)
    • timeout {Number} 超时(缺省为 0)
    • maxBuffer {Number} 最大缓冲(缺省为 200*1024)
    • killSignal {String} 结束信号(缺省为 'SIGTERM')
  • callback {Function} 进程结束时回调并带上输出
    • error {Error}
    • stdout {Buffer}
    • stderr {Buffer}
  • 返回:ChildProcess 对象

在 shell 中执行一个命令并缓冲输出。

child = exec('cat *.js bad_file | wc -l',
function (error, stdout, stderr) {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null) {
console.log('exec error: ' + error);
}
});

回调参数为 (error, stdout, stderr)。当成功时,error 会是 null。当遇到错误时,error 会是一个Error 实例,并且 err.code 会是子进程的退出代码,同时 err.signal 会被设置为结束进程的信号名。

第二个可选的参数用于指定一些选项,缺省选项为:

{ encoding: 'utf8',
timeout: 0,
maxBuffer: 200*1024,
killSignal: 'SIGTERM',
cwd: null,
env: null }

如果 timeout 大于 0,则当进程运行超过 timeout 毫秒后会被终止。子进程使用 killSignal 信号结束(缺省为 'SIGTERM')。maxBuffer 指定了 stdout 或 stderr 所允许的最大数据量,如果超出这个值则子进程会被终止。

补充:

注意问题2的解决方法

对于同文件名,排除的文件夹包含,去除的方法,在命令 开关里。

经过实验可以使用下面这个命名来处理

开关

r0 只递归通配符名称的子目录

rar a -r0 压缩文件名.rar 文件列表

node实现rar格式压缩的更多相关文章

  1. 如何在linux下解压缩rar格式的文件压缩包

    ##########################################################如何在linux下解压缩rar格式的文件压缩包#date:2014年2月15日22: ...

  2. Java生成压缩文件(zip、rar 格式)

    jar坐标: <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</ar ...

  3. Linux下解压rar格式的压缩文件

    如果需要在Linux系统下解压RAR格式的压缩包,需要安装Linux版本的rar程序. 具体安装步骤如下: wget http://www.rarlab.com/rar/rarlinux-3.8.0. ...

  4. Java对zip格式压缩和解压缩

    Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...

  5. Java用ZIP格式压缩和解压缩文件

    转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutput ...

  6. <<< 将一个rar格式的文件变成一张jpg图片,按照后缀来选择打开他的模式

    把一个压缩格式和一张图片合成,按照后缀来判断他打开是图片还是解压文件,后缀是jpg打开的就是一张图片,后缀是rar打开的就是一个压缩包,里面存放你放的东西   :例如(秘密) 准备一张图片,test. ...

  7. linux中tar命令(打包、压缩、解压)、zip和unzip、rar多种压缩文件

    一.名词解释 打包:将一大堆文件或目录变成一个总的文件[tar命令] 压缩:将一个大的文件通过一些压缩算法变成一个小文件[gzip,bzip2等] Linux中很多压缩程序只能针对一个文件进行压缩,这 ...

  8. python tar.gz格式压缩、解压

    一.压缩 需求描述 现在有一个目录,需要将此目录打包成tar.gz文件.因为有一个Django项目,需要用到此功能! tar.gz 目录结构如下: ./ ├── folder │   ├── .doc ...

  9. node.js grunt文件压缩

    对于前段来说,熟悉node的人其实还并不是太多,如果您想入门一门后端语言我建议还是从node入手最好. 我也是最近开始学习node,来谈谈近期对node的学习的心得. 提到node首先就是要安装一大堆 ...

随机推荐

  1. 初级Java面试题 – SSM框架篇

    加入我的QQ群(701974765) 获取更多好用又好玩的软件,还有不定期发放的福利呦(- ̄▽ ̄)- Spring的优点/对Spring的理解 Spring的AOP编程 Spring的IOC Spri ...

  2. java面向对象基础回顾

    (49)  (0) 面向对象 啥是面向对象 什么是多态多态的机制 接口和抽象类区别 个人理解 代码实现 面向对象 学习java大家接触到的最多的话语无非就是面向对象,可能大家没有仔细研究过这个问题,但 ...

  3. CodeForces 24D Broken robot (概率DP)

    D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  4. Python多股票同周期可视化

    import warnings warnings.filterwarnings("ignore") import numpy as np import pandas as pd i ...

  5. Java8 中的时间和日期 API

    1. 日期和时间概述 LocalDate,LocalTime,LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601 日历系统 的日期,时间,日期和时间;它们提供了简单的日期 ...

  6. Ubuntu安装Python3 和卸载

    Python2中文的解决 在py文件第一行添加 #coding=utf-8 1 规范的应该这么写 #-*- coding:utf-8 -*- 1 安装python 系统默认安装Python2 安装Py ...

  7. DRF频率、分页、解析器、渲染器

    DRF的频率 频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定 ...

  8. LDPC知识点

    LDPC:low Density Parity Check BCH:以前NAND的纠错 80s TLC以镁光都是以LDPC纠错. 对比: BCH:超过阈值就绝对纠正不回来了. LDPC:纠正的结果是一 ...

  9. PAT 1052 Linked List Sorting [一般]

    1052 Linked List Sorting (25 分) A linked list consists of a series of structures, which are not nece ...

  10. springBoot 整合 RabbitMQ 的坑

    1.Consumer raised exception, processing can restart if the connection factory supports it. Exception ...