暂时未发现node有好用的rar解压/压缩库,所以就自己搜索了一下,简单写了一个,并做了个简单的封装。

rar文件的压缩/解压是通过命令行来完成的,所以就需要node 的child_process库,这个npm i xxx就可以了。

大概了解了下rar的语法,这个在WinRAR的安装文件目录下可以看到,我的是:C:/Program Files/WinRAR/WinRAR.chm,

rar命令和rar参数都可以看到,这里就不贴图了,

压缩文件命令:rar a rarPath srcPath -y,其中rarPath是要压缩到的文件地址,例如test.rar,srcPath是要压缩的文件或者文件夹,-y表示如果有提示确认,同意所有操作

解压文件命令:rar x rarPath destPath -y,其中rarPath是压缩文件的地址,例如test.rar,destPath是解压的路径,-y表示如果有提示确认,同意所有操作

const fs = require('fs');
const exec = require('child_process').exec;

/**
 * 执行cmd
 * @param cmd
 */
function execute(cmd) {
    exec(cmd, {encoding: 'binary'}, function (err, stdout, stderr) {
        if (err) {
            console.log(`err:${err}`);
        }
        if (stderr) {
            console.log(`stderr:${stderr}`);
        }
    });
}

/**
 * 判断文件或者路径是否存在
 * @param path
 * @param success 成功回调函数
 * @param error 错误回调函数
 */
function exist(path, success, error) {
    fs.exists(path, (exists) => {
        if (exists) {
            success && success();
        } else {
            console.log(`${path} not exist and create...`);
            error && error();
        }
    });
}

const rar = {
    /**
     * 压缩文件
     * @param config
     */
    compress: function (config) {
        let cmd = `rar a ${config.rarPath} ${config.srcPath} -y`;
        exist(config.srcPath, () => {
            execute(cmd);
        });
    },
    /**
     * 解压文件
     * @param config
     */
    decompress: function (config) {
        let cmd = `rar x ${config.rarPath} ${config.destPath} -y`;
        exist(config.rarPath, () => {
            exist(config.destPath, () => {
                execute(cmd);
            }, () => {
                fs.mkdir(config.destPath, (err) => {
                    if (err) {
                        console.log(err);
                    } else {
                        execute(cmd);
                    }
                });
            });
        });
    }
};

module.exports = rar;

测试代码:

Node rar压缩/解压文件_rar压缩/解压

测试结果:

Node rar压缩/解压文件_rar压缩/解压_02

Node rar压缩/解压文件_回调函数_03