使用电子构建器电子更新器跨电子应用程序更新的持久文件存储

Posted

技术标签:

【中文标题】使用电子构建器电子更新器跨电子应用程序更新的持久文件存储【英文标题】:Persistent file storage across electon app updates with electron-builder electron-updater 【发布时间】:2021-10-22 13:42:09 【问题描述】:

当我使用 electron-builder autoUpdater 更新 Electron 应用程序时,我定义的所有文件存储都将被覆盖。我需要哪些设置才能使这些文件持久存在?

这是一个 MCVE 示例(用于主进程):

const  app, BrowserView, BrowserWindow,ipcMain  = require('electron');
const log = require("electron-log");
const  autoUpdater  = require("electron-updater");
const fs = require( 'fs');
const path = require('path');

let win
let rand = String(Math.floor(Math.random() * 10000));
console.log('Generated random number',rand)

app.whenReady().then(async () => 
  win = new BrowserWindow(
    fullscreen: false,
    webPreferences: 
      nodeIntegration: false,
      preload: path.join(__dirname, 'preload.js')
    
  )
  win.loadFile('index.html');
  setInterval(function() 
    let a = autoUpdater.checkForUpdatesAndNotify();
  , 60000);


  let exists = false;
  fs.stat('persistentFile',(err, stats) => 
      if (err == null)
        exists = true
      
      if (!exists)
          fs.writeFile('persistentFile',rand,(err)=>
            if (err) throw err;
            win.webContents.send('console_message', 'Persistent file has been created!',rand);
            console.log('Persistent file has been created!',rand);
          )
      
      else 
          fs.readFile('persistentFile',(err,data)=>
            if (err) throw err;
            win.webContents.send('console_message', 'Persistent already exists',data);
            console.log('Persistent already exists',data);
          )
      
    )

  win.webContents.send('console_message', 'Random No is' + String(rand));


)

在此示例中,我希望文件 persistentFile 在更新中保持不变,以便它包含从第一个版本生成的数字。但是,目前,每次更新都会覆盖该文件。

您将如何确保跨电子构建器自动更新的持久文件存储?

【问题讨论】:

cameronnokes.com/blog/how-to-store-user-data-in-electron by @ccnokes 【参考方案1】:

在查看了 Cameron Nokes 的优秀博客后,我设法做到了这一点:

cameronnokes.com/blog/how-to-store-user-data-in-electron:

将用户数据存储在操作系统的指定位置 用户的应用数据是原生应用持久化用户的惯用方式 数据因为:

当我们自动更新应用程序时,我们的源文件可能会被移动或删除

更改或添加到应用的内部文件将使代码无效 签名

为此,我使用const userDataPath = app.getPath('userData'); 获取操作系统应用存储位置的路径。然后将'persistentFile'的引用改为String(userDataPath)+'/persistentFile'

【讨论】:

以上是关于使用电子构建器电子更新器跨电子应用程序更新的持久文件存储的主要内容,如果未能解决你的问题,请参考以下文章

在使用电子更新器更新之前请参阅发行说明

将亚马逊 s3 与电子制造商的自动更新程序一起使用 [关闭]

导入电子更新程序时遇到问题

NoCredentialProviders:使用 AWS S3 的电子更新程序中的链错误中没有有效的提供者

错误 TS2305:模块 '"http"' 没有导出的成员 'OutgoingHttpHeaders'。尝试将电子更新器添加到电子项目中时

如何静默自动更新通过 NSIS 为所有用户/每台机器安装的电子应用程序?