🦓electron-🐴渲染进程操控主进程-🦄读写本地文件数据

900 阅读2分钟

Electron部分(主进程部分)

可能涉及到的其他小问题

1.在package.json里面配置打包后目标文件应该储存的位置:

打包后目录结构会发生改变

"extraResources": [
    {
    "from": "./build/data.db",
    "to": "app/src/"
    }
],

2.node使用到的主要功能模块:

fs.readFile(...)//读
fs.writeFile(...)//写

3.序列化和反序列化:

//方法一
var serialize = require('node-serialize');

serialize.serialize(obj)//序列化
serialize.unserialize(str)//反序列化
//方法二
JSON.stringify()//序列化
JSON.parse()//反序列化

目标文件.json和.text类型均可

实现

读取

  //读取本地文件
  ipcMain.on('asynchronous-message-get', function (event) {
    let urlName = 'asynchronous-reply-get'//消息发布-发布名称
    // 传给渲染进程数据
    fs.readFile(path.join(__dirname, "data.text"), "utf8", (err, data) => {
      if (err) {
        event.sender.send(urlName, 500, "读取失败");
      } else {
        event.sender.send(urlName, 200, data);
      }
    })
  });

增改

  //增改本地文件
  ipcMain.on('asynchronous-message-set', function (event, key, value) {
    let urlName = 'asynchronous-reply-set'//消息发布-发布名称
    fs.readFile(path.join(__dirname, "data.text"), "utf8", (err, data) => {
      if (err) {
        event.sender.send(urlName, 500, "目标文件异常");
      } else {
        try {
          //文件内json无法序列化的情况,使用空对象替换
          let obj = new Object()
          if (serialize.unserialize(data)) {
            obj = serialize.unserialize(data)
          }
          obj[key] = value
          let json = serialize.serialize(obj)
          fs.writeFile(path.join(__dirname, "data.text"), json, "utf8", (err) => {
            if (err) {
              event.sender.send(urlName, 500, "写入失败");
            } else {
              event.sender.send(urlName, 200, "写入成功");
            }
          })
        } catch (error) {
          console.log(error);
          //如果因为本地文件无法序列化而抛出错误,就直接重置数据叭(部分数据序列化后无法反序列化)
          let json = serialize.serialize(new Object())
          fs.writeFile(path.join(__dirname, "data.text"), json, "utf8", () => { })
        }
      }
    })
  });

删除

  //删除本地文件json中的某一个键[和值]
  ipcMain.on('asynchronous-message-del', function (event, key) {
    let urlName = 'asynchronous-reply-del'//消息发布-发布名称
    fs.readFile(path.join(__dirname, "data.text"), "utf8", (err, data) => {
      if (err) {
        event.sender.send(urlName, 500, "目标文件异常");
      } else {
        try {
          //文件内json无法序列化的情况,抛出异常
          if (serialize.unserialize(data)) {
            let obj = serialize.unserialize(data)
            if (obj[key]) {
              delete obj[key]
            }
            let json = serialize.serialize(obj)
            fs.writeFile(path.join(__dirname, "data.text"), json, "utf8", (err) => {
              if (err) {
                event.sender.send(urlName, 500, "删除失败");
              } else {
                event.sender.send(urlName, 200, "删除成功");
              }
            })
          } else {
            event.sender.send(urlName, 500, "目标文件异常");
          }
        } catch (error) {
          console.log(error);
          //如果因为本地文件无法序列化而抛出错误,就直接重置数据叭(部分数据序列化后无法反序列化)
          let json = serialize.serialize(new Object())
          fs.writeFile(path.join(__dirname, "data.text"), json, "utf8", () => { })
        }
      }
    })
  });

vue项目部分(渲染进程部分)

使用Promise进行封装,方便调用

    //读取本地文件-向主进程发起请求--------------------------------------------------
    async getJson() {
      // 渲染进程->主进程
      this.$electron.ipcRenderer.send("asynchronous-message-get");
      return new Promise((req, rej) => {
        // 主进程->渲染进程
        this.$electron.ipcRenderer.on("asynchronous-reply-get", function(
          event,
          code,
          arg
        ) {
          setTimeout(rej, 3000);
          if (code == 200) {
            return req(arg);
          } else if (code == 500) {
            return rej(arg);
          }
        });
      });
    },
    //增修本地文件-向主进程发起请求-------------------有则增,无则改-------------------------------
    async setJson(key, value) {
      // 渲染进程->主进程
      this.$electron.ipcRenderer.send("asynchronous-message-set", key, value);
      return new Promise((req, rej) => {
        // 主进程->渲染进程
        this.$electron.ipcRenderer.on("asynchronous-reply-set", function(
          event,
          code,
          arg
        ) {
          setTimeout(rej, 3000);
          if (code == 200) {
            return req(arg);
          } else if (code == 500) {
            return rej(arg);
          }
        });
      });
    },
    //删除本地文件-向主进程发起请求--------------------------------------------------
    async delJson(key) {
      // 渲染进程->主进程
      this.$electron.ipcRenderer.send("asynchronous-message-del", key);
      return new Promise((req, rej) => {
        // 主进程->渲染进程
        this.$electron.ipcRenderer.on("asynchronous-reply-del", function(
          event,
          code,
          arg
        ) {
          setTimeout(rej, 3000);
          if (code == 200) {
            return req(arg);
          } else if (code == 500) {
            return rej(arg);
          }
        });
      });
    },

在vue项目中的调用

    //读取本地文件---------------------------------------------------
    getData() {
      this.getJson()
        .then(res => {
          let data = JSON.parse(res);
        })
        .catch(err => {
          console.log("err", err);
        });
    },
    //修改本地文件---------------------------------------------------
    setData(key, value) {
      this.setJson(key, value)
        .then(res => {})
        .catch(err => {
          console.log("err", err);
        });
    },
    //删除本地文件---------------------------------------------------
    delData(key) {
      this.delJson(key)
        .then(res => {})
        .catch(err => {
          console.log("err", err);
        });
    },