美文网首页
electron中实现文件的读取和写入

electron中实现文件的读取和写入

作者: 扶得一人醉如苏沐晨 | 来源:发表于2023-09-20 15:20 被阅读0次

    一、背景知识

    1.1、nodejs内置的fs文件系统模块

    Nodejs--fs文件系统模块 - 简书 (jianshu.com)

    1.2、fs 文件系统模块--路径动态拼接的问题

    Nodejs--fs 文件系统模块--路径动态拼接的问题 - 简书 (jianshu.com)

    1.3、process.cwd()

    可以用来获取执行node命令时候的文件夹地址

    二、如何动态获取Electron中配置文件的path?

    __dirname

    Node中的__dirname(前面有两个下划线)是一个全局变量,用来确定当前运行的文件所在的目录。是被执行的js文件的目录。


    process.cwd()

    process.cwd()是表示当前工作目录,是当前执行node命令时候的目录。

    我们先来看下不同环境中的process.cwd()获取的值(__dirname和process.cwd()相比较之下还是选择了process.cwd())

    /* 执行node命令时候的文件夹地址 */
    const node_serve_path = process.cwd();
    // 读取配置文件
    export function readFile() {
      return new Promise((resolve, reject) => {
        console.log("node_serve_path----", node_serve_path);
        console.log("__dirname---", __dirname);
      });
    }
    

    本地运行打印结果

    image.png

    直接运行包里面的exe程序打印结果

    image.png

    安装成功后打印结果

    image.png image.png

    从上面可以看出--这里的文件路径会根据环境不同而变化

    我们重点还是放在安装后的打印结果,因为exe肯定都是用来安装到我们的电脑上面的

    三、如何让我们项目中的配置文件--打包安装后--仍旧允许我们访问并且读写呢?

    3.1、extraResources

    这里需要用到electron的打包额外资源配置extraResources
    它允许我们打包安装后--仍可以访问并且读写配置中的文件目录

    3.2、这是我想要读写的配置文件的位置

    image.png

    3.3、找到vue.config.js--把我的配置文件目录配置为extraResources

    extraResources: ["./bin", "./conf"],

    pluginOptions: {
        electronBuilder: {
          // 线上打包环境,静态资源不加载的问题
          customFileProtocol: "./",
          nodeIntegration: true,
          builderOptions: {
            productName: "设备互联终端", //项目名,也是生成的安装文件名 桌面应用.exe
            /* extraResources在Electron的打包程序安装完成后,
               同样可以根据不同的计算机,做一些特殊的配置,
               这就需要在Electron中设置一个配置文件,同时赋予程序对文件有读写的权限。
             */
            extraResources: ["./bin", "./conf"],
            win: {
              //win相关配置
              icon: "icon.ico", //图标,当前图标在根目录下,注意这里有两个坑
              target: [
                {
                  target: "nsis", //利用nsis制作安装程序
                  arch: [
                    "x64", //64位
                  ],
                },
              ],
            },
          },
        },
      },
    

    四、获取打包后的配置文件路径

    node_serve_path是打包安装后的process.cwd()打印的结果

    image.png

    我们顺着这个路径找下去、可以看到有个resources文件夹,这就是electron的额外资源存放的目录了

    image.png

    点开resources发现了我的配置文件目录conf

    image.png

    点开conf就是我的配置文件了

    image.png

    既然目录层级确定了,我们就通过node的path模块组装我们的读写路径吧
    这里路径动态判断了下--加以区分一下本地和打包的区别

    /* 执行node命令时候的文件夹地址 */
    const node_serve_path = process.cwd();
    /* 判断是否是生产环境 */
    const isDev = process.env.NODE_ENV === "development";
    /* 需要读写的文件地址 */
    const file_path = isDev
      ? path.join(node_serve_path, "/conf/11application.properties")
      : path.join(node_serve_path, "/resources/conf/application.properties");
    

    五、封装一个fs.js

    读写完整代码如下

    //引入node原生fs模块
    const fs = require("fs");
    // 引入node内置的path模块
    const path = require("path");
    //引入node原生读写配置
    const ini = require("ini");
    /* 执行node命令时候的文件夹地址 */
    const node_serve_path = process.cwd();
    /* 判断是否是生产环境 */
    const isDev = process.env.NODE_ENV === "development";
    /* 需要读写的文件地址 */
    const file_path = isDev
      ? path.join(node_serve_path, "/conf/11application.properties")
      : path.join(node_serve_path, "/resources/conf/application.properties");
    
    // 读取配置文件
    export function readFile() {
      return new Promise((resolve, reject) => {
        fs.readFile(file_path, "utf8", function (err, dataStr) {
          if (err) return reject(err.message); //读取失败
          /* application.properties  文件内容符合ini配置文件的格式,
          就可以通过ini.parse把读取到的文件转成js可识别的对象 */
          resolve(ini.parse(dataStr.toString()));
        });
      });
    }
    // 更改配置文件
    export function writeFile(config) {
      return new Promise((resolve, reject) => {
        fs.writeFile(file_path, ini.stringify(config), function (err) {
          if (err) return reject(err.message); //写入失败
          resolve("写入成功");
        });
      });
    }
    
    

    相关文章

      网友评论

          本文标题:electron中实现文件的读取和写入

          本文链接:https://www.haomeiwen.com/subject/yygnvdtx.html