我们知道zip是一个开放的标准,使用起来没有版权问题,很多软件都可以支持zip文件的处理。而rar格式由RARLAB开发,使用RAR格式可能需要遵守RARLAB的许可协议,当然了rarlab也比较有意思,它的软件你不注册也可以一直使用,windows平台上会弹出广告,也还是有不少企业购买了winrar的许可。据说以后windows系统会内置对rar的支持,rarlab估计更不容易收到用户的钱了。闲话不多说,因为rar也很好用,至少在windows平台上用户还挺多,开发软件还是需要考虑对rar的支持,提升下用户体验。
npm的资源里,支持rar的比较少,基本上支持的也是要靠调用系统安装的rar或者winrar,rar的命令也不复杂,干嘛还要去求诸外,自己手写一个用算了。
手边有一个对rar的需求,主要是处理目录的打包和解压。简单写了两个函数,封装了一下。
const cp = require('child_process');
const winRarPath = 'D:\\Program Files\\WinRAR\\Rar.exe';
function a(sourceFolder, destRARFile,logger) { return new Promise((resolve,reject)=>{
cp.execFile(winRarPath, ['a','-ep1','-r','-idcdp','-inul',destRARFile,sourceFolder], (error, stdout, stderr) => {
if (error) { if (logger!=undefined) logger.error(`exec error: ${error}`); reject(error); }
if (stderr) { if (logger!=undefined) logger.error(`stderr: ${stderr}`); reject(stderr); }
resolve();
});
});
}
function x(sourceFolder, destRARFile,logger) { return new Promise((resolve,reject)=>{
cp.execFile(winRarPath, ['x','-idcdp','-inul',destRARFile,sourceFolder], (error, stdout, stderr) => {
if (error) { if (logger!=undefined) logger.error(`exec error: ${error}`); reject(error); }
if (stderr) { if (logger!=undefined) logger.error(`stderr: ${stderr}`); reject(stderr); }
resolve();
});
});
}
module.exports = { a,x }
其中入参logger是log4js的logger,没有使用的话,传undefined即可,或者直接输出到控制台也可以的。
使用起来也很简单:
const rar=require("./winrar.js");
rar.a('e:\\test\\src', 'e:\\test\\rar\\backup.rar',undefined).then(()=>console.log("done")).catch(e=>console.log(e))
//rar.x('e:\\test\\dest', 'e:\\test\\rar\\backup.rar',undefined).then(()=>console.log("done")).catch(e=>console.log(e))