node实现rar格式压缩
背景
由于公司的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格式压缩的更多相关文章
- 如何在linux下解压缩rar格式的文件压缩包
##########################################################如何在linux下解压缩rar格式的文件压缩包#date:2014年2月15日22: ...
- Java生成压缩文件(zip、rar 格式)
jar坐标: <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</ar ...
- Linux下解压rar格式的压缩文件
如果需要在Linux系统下解压RAR格式的压缩包,需要安装Linux版本的rar程序. 具体安装步骤如下: wget http://www.rarlab.com/rar/rarlinux-3.8.0. ...
- Java对zip格式压缩和解压缩
Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...
- Java用ZIP格式压缩和解压缩文件
转载:java jdk实例宝典 感觉讲的非常好就转载在这保存! java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包. 使用zipoutput ...
- <<< 将一个rar格式的文件变成一张jpg图片,按照后缀来选择打开他的模式
把一个压缩格式和一张图片合成,按照后缀来判断他打开是图片还是解压文件,后缀是jpg打开的就是一张图片,后缀是rar打开的就是一个压缩包,里面存放你放的东西 :例如(秘密) 准备一张图片,test. ...
- linux中tar命令(打包、压缩、解压)、zip和unzip、rar多种压缩文件
一.名词解释 打包:将一大堆文件或目录变成一个总的文件[tar命令] 压缩:将一个大的文件通过一些压缩算法变成一个小文件[gzip,bzip2等] Linux中很多压缩程序只能针对一个文件进行压缩,这 ...
- python tar.gz格式压缩、解压
一.压缩 需求描述 现在有一个目录,需要将此目录打包成tar.gz文件.因为有一个Django项目,需要用到此功能! tar.gz 目录结构如下: ./ ├── folder │ ├── .doc ...
- node.js grunt文件压缩
对于前段来说,熟悉node的人其实还并不是太多,如果您想入门一门后端语言我建议还是从node入手最好. 我也是最近开始学习node,来谈谈近期对node的学习的心得. 提到node首先就是要安装一大堆 ...
随机推荐
- 初级Java面试题 – SSM框架篇
加入我的QQ群(701974765) 获取更多好用又好玩的软件,还有不定期发放的福利呦(- ̄▽ ̄)- Spring的优点/对Spring的理解 Spring的AOP编程 Spring的IOC Spri ...
- java面向对象基础回顾
(49) (0) 面向对象 啥是面向对象 什么是多态多态的机制 接口和抽象类区别 个人理解 代码实现 面向对象 学习java大家接触到的最多的话语无非就是面向对象,可能大家没有仔细研究过这个问题,但 ...
- CodeForces 24D Broken robot (概率DP)
D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- Python多股票同周期可视化
import warnings warnings.filterwarnings("ignore") import numpy as np import pandas as pd i ...
- Java8 中的时间和日期 API
1. 日期和时间概述 LocalDate,LocalTime,LocalDateTime类的实例是不可变的对象,分别表示使用 ISO-8601 日历系统 的日期,时间,日期和时间;它们提供了简单的日期 ...
- Ubuntu安装Python3 和卸载
Python2中文的解决 在py文件第一行添加 #coding=utf-8 1 规范的应该这么写 #-*- coding:utf-8 -*- 1 安装python 系统默认安装Python2 安装Py ...
- DRF频率、分页、解析器、渲染器
DRF的频率 频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定 ...
- LDPC知识点
LDPC:low Density Parity Check BCH:以前NAND的纠错 80s TLC以镁光都是以LDPC纠错. 对比: BCH:超过阈值就绝对纠正不回来了. LDPC:纠正的结果是一 ...
- PAT 1052 Linked List Sorting [一般]
1052 Linked List Sorting (25 分) A linked list consists of a series of structures, which are not nece ...
- springBoot 整合 RabbitMQ 的坑
1.Consumer raised exception, processing can restart if the connection factory supports it. Exception ...