前几天做桌面程序的时候准备因为数字签名的事无法实现热更新,想着做一个假的后台下载然后进行替换安装
<script>
import { remote } from "electron"; //引入eletron
import path from "path";
import fs from "fs";
export default {
data() {
return {
address: "", //文件数组
filelist : "", //是福可以进行判断更新的操作
};
},
created() {
// 获取exe文件的目录
this.address = path.dirname(remote.app.getPath("exe"));
// 获取exe文件的目录下的所有文件数组
this.filelist= fs.readdirSync(this.address);
},
};
script>
下载的话我们就要用到主进程了
<script>
import { remote, ipcRenderer } from "electron"; //引入eletron
import path from "path";
import adm_zip from "adm-zip";
import fs from "fs";
export default {
data() {
return {
address : "", //工位id
filelist: [], //文件数组
};
},
created() {
// 获取exe文件的目录)
this.address = path.dirname(remote.app.getPath("exe"));
this.filelist = fs.readdirSync(this.address);
},
mounted() {
// 判断是否下载
this.judgeupload();
},
methods: {
// 判断是否下载
judgeupload() {
//把当前文件的路径传过去\\代表路径
ipcRenderer.send("download", {
url: "你的下载路径",
directory: this.address + "\\" + "你的文件名",
});
},
};
script>
import { app, BrowserWindow, globalShortcut, ipcMain } from "electron";
//在ready事件里
app.on("ready", async () => {
//接受到下载信号开始下载
ipcMain.on("download", (event, info) => {
directory = info.directory
mainWindow.webContents.downloadURL(info.url);
});
//监听下载
mainWindow.webContents.session.on("will-download",
(event, item, webcontent) => {
//设置下载文件名
item.setSavePath(directory)
item.on('updated', (event, state) => {
// 下载的事件
if (state === "progressing") {
if (!item.isPaused()) {
//下载完成后传回进度
mainWindow.webContents.send("downing",
item.getReceivedBytes() * 100 / item.getTotalBytes())
}
}
})
item.once('done', (event, state) => {
// 下载完成的事件
if (state === "completed") {
//下载完成后传回进度
mainWindow.webContents.send("downing", 100)
}
})
})
});
因为当前文件打开的时候无法替换,我们就需要后台下载另一个文件进行解压,下载的方法同上
import { exec } from "child_process"; //引入打开其他程序的方法
//文件路径第一步有,自己拼一下
exec("你要打开文件的路径")
解压的时候中文名会转换成??我们处理一下,进行一下文件的重命名,以及删除的功能
<script>
import { remote, ipcRenderer } from "electron"; //引入eletron
import path from "path";
import adm_zip from "adm-zip";
import fs from "fs";
export default {
methods: {
// 判断是否下载
judgeupload() {
//下载完成后接受的回调
ipcRenderer.on("downing", (event, item) => {
this.progress = parseInt(item);
if (this.progress === 100) {
var unzip = new adm_zip(
this.address + "\\" + "压缩包名称"
);
//解压到当前目录下
unzip.extractAllTo(this.address, true);
//获取当前文件下所有文件,并且判断是否有??文件
this.name = fs.readdirSync(this.address)
.find(item => item.indexOf("��") > -1)
//如果不会存在打开完成的exe
if (!this.name) {}
else {//如果存在,删除原文件
fs.unlink(this.address + "\\" + `文件名`, (err) => {
if (err) {
console.log(err.message);
return;
}
//删除成功后,开始重命名(当前文件名,新的文件名)
fs.rename("当前文件名", "新的文件名", (err) => {
if (err) throw err;
//完成后打开完成的exe
});
});
}
});
},
};
script>
就是这样,下班!!!