关于electron中后台下载的方法

前几天做桌面程序的时候准备因为数字签名的事无法实现热更新,想着做一个假的后台下载然后进行替换安装

1.先获取当前的文件路径

<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>

2.获取完当前文件的路径后开始下载

下载的话我们就要用到主进程了

先在当前的js下给主进程一个下载的信号

<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>

接下来就是主进程接受开始下载main.js(electron下

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)
      }
    })
  })
});

3.下载完成后打开另一个软件进行解压

因为当前文件打开的时候无法替换,我们就需要后台下载另一个文件进行解压,下载的方法同上

import { exec } from "child_process"; //引入打开其他程序的方法
//文件路径第一步有,自己拼一下
exec("你要打开文件的路径")

4.在新的程序进行解压

解压的时候中文名会转换成??我们处理一下,进行一下文件的重命名,以及删除的功能

<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>

就是这样,下班!!!

你可能感兴趣的:(electron,vue.js,前端,electron)