方法一:使用node-unzipper 加密压缩包的解压,这个的话这个博客上写的很好,我开始就是用他的方法做的
上诉方法有个很大的缺陷,博主也指出来了,就是加密解压大文件会很慢,这个我测试的时候,发现一个不大的文件(解压前1M多,解压后5M左右)也要花费1,2分钟,显然这个效果有点难接受,后面尝试找了很多方法都不太满意,加密解压的第三方模块比较慢,后面发现在本地解压还是挺快的,就想到用内部进程开个cmd命令调用winrar.exe去解压,后面摸索着实现了,记录下提供给后面需要的同学,这个方法可能存在其他的一些缺陷,但是解压速度已经达到了可以接受的范围。
方法二:调用cmd命令调用winrar.exe实现解压。
封装一个cmd解压命令方法 unzipCMD.js (解压命令参数可自行调改 ,可在cmd中查看 C:\Program Files\WinRAR>rar.exe -? C:\Program Files\WinRAR>unrar.exe -?)
const exec = require('child_process').exec
//cmdPath:winrar.exe路径
//zipPath:压缩包文件
//outPath:解压文件目录
//加密密码
function unzipCmd (cmdPath,zipPath,outPath,pwd) {
// 任何你期望执行的cmd命令,ls都可以
let cmdStr1 = 'WinRAR.exe -ibck -y x -t -p'+pwd+' "'+zipPath+'" "'+outPath+'"'
//let cmdPath = cmdPath
// 子进程名称
console.log(cmdStr1);
let workerProcess
return runExec(cmdStr1)
function runExec (cmdStr) {
return new Promise((_resolve, _reject) => {
var _result = 1;
workerProcess = exec(cmdStr, { cwd: cmdPath })
// 打印正常的后台可执行程序输出
workerProcess.stdout.on('data', function (data) {
console.log('stdout: ' + data)
})
// 打印错误的后台可执行程序输出
workerProcess.stderr.on('data', function (data) {
console.log('stderr: ' + data)
_result = 0;
_reject();
})
// 退出之后的输出
workerProcess.on('close', function (code) {
console.log('out code:' + code)
_resolve(_result)
})
});
}
}
module.exports = {
"unzipCmd": unzipCmd
};
调用方法(以electron子页面调用为例)
<!DOCTYPE html>
<html lang="en">
<head>
<title>myapp</title>
<script>window.$ = window.jQuery = require("./js/jquery.min");</script>
</head>
<body>
<p>demo</p>
<script>
var fs= require("fs")
var unzipCMD = require('./unzipCMD');
$(function(){
var outPath = 'E:/Node_js/demo';//文件夹路径是否需要创建
if (!fs.existsSync(outPath)) {
fs.mkdirSync(outPath);
}
unzipCMD.unzipCmd("C:/Program Files/WinRAR",'E:/Node_js/demo/xxx.zip', outPath, "abc")
.then(function (e) {
console.log(e);
})
}
</script>
</body>
</html>
若是存在安全性错误提示,可以参考下面的配置
win = new BrowserWindow({
width: 1200,
height: 600 ,
webPreferences: { //js交互
nodeIntegration: true,
enableRemoteModule:true,
webSecurity: false, //禁用同源策略
plugins: true, //是否支持插件
nativeWindowOpen: true, //是否使用原生的window.open()
webviewTag: true, //是否启用 <webview> tag标签
sandbox: false,
enableRemoteModule:true,
},
})
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'