Electron 应用程序和用户 AddData 在生产环境之间没有通信

No communication between electron app and user AddData on production

我创建了一个具有用户 configuration/settings 的电子应用程序(更改主题、跟踪和保留 window 的当前大小和位置)。我将包含所有这些的 json 文件保存在用户 AppData (app.getPath('userData')) 中,在开发中运行良好,但在与 electron-builder 打包后,应用程序不再与应用程序数据。尝试更改主题但新颜色无法写入 AppData,大小和位置未更改。沮丧...

请问如果我必须使用AppData,接下来我该怎么做

const { app, BrowserWindow, ipcMain } = require("electron");
let isDev = require('electron-is-dev');
const path = require('path');
const fs = require('fs');
const { setColors } = require('./ipc');

const userDir = app.getPath('userData');

let isConfigDir = fs.existsSync(path.join(userDir, 'config'));
let isSizeDir = fs.existsSync(path.join(userDir, 'config/size.json'))
let isPosDir = fs.existsSync(path.join(userDir, 'config/pos.json'));
let isColorDir = fs.existsSync(path.join(userDir, 'config/colors.json'));

//create config dir if not already exists
if(!isConfigDir){
    fs.mkdirSync(path.join(userDir, '/config'))
}

//check and create config files if not already exist
let pos;
if(!isPosDir){
    let pos_ = {"x":636,"y":0};
    fs.writeFileSync(path.join(userDir, 'config/pos.json'), JSON.stringify(pos_));
    pos = pos_
}else{
    pos = JSON.parse(fs.readFileSync(path.join(userDir, 'config/pos.json'), "utf8"))
}

let size
if(!isSizeDir){
    let size_ = {"width":701,"height":768}
    fs.writeFileSync(path.join(userDir, 'config/size.json'), JSON.stringify(size_));
    size = size_;
}else{
    size = JSON.parse(fs.readFileSync(path.join(userDir, 'config/size.json'), "utf8"))
}

ipcMain.handle("getColors", (event, args)=>{
    let colors;
    if(!isColorDir){
        let colors_ = {"bg":"gold","text":"#000"}
        fs.writeFileSync(path.join(userDir, 'config/colors.json'), JSON.stringify(colors_));
        colors = colors_
        return colors;
    }else{
        colors = JSON.parse(fs.readFileSync(path.join(userDir, 'config/colors.json'), "utf8"));
        return colors;
    }
})


let win;
function createWin(){
    win = new BrowserWindow({
        width:size.width,
        height: size.height,
        x: pos.x,
        y: pos.y,
        title: 'BMS',
        webPreferences:{
            preload: path.join(__dirname, "preload.js")
        }
    });
    isDev ? win.loadURL('http://localhost:3000') : win.loadFile('views/build/index.html')

    win.on("closed", ()=>win = null);
    
    // set window size in file size.json when the system resized
    win.on('resized', ()=>{
        let size = {
            width: win.getBounds().width,
            height: win.getBounds().height,
        }
        fs.writeFileSync(path.join(userDir, 'config/size.json'), JSON.stringify(size))
    })

    // set window position in file size.json when the window moves
    win.on('move', ()=>{
        let pos = {
            x: win.getBounds().x,
            y: win.getBounds().y
        }
        fs.writeFileSync(path.join(userDir, 'config/pos.json'), JSON.stringify(pos))
    })
}

app.on("ready", ()=>{
    //create window
    createWin();
    
    setColors(userDir)

})


app.on("window-all-closed", ()=>{
    if(process.platform !== 'darwin'){
        app.quit()
    }
})
app.on('active', ()=>{
    if(win===null){
        createWin()
    }
})

查看您的代码,我怀疑您的 /config 文件夹在 运行 您的应用程序时不存在。因此,您的所有变量 isSizeDirisPosDir 等都是 false,即使在第 17 行创建文件夹后也保持为假。

我会在第 11 行之后移动 /config 文件夹创建。

你应该看看 electron-json-storage 包。该包将根据用户 OS 系统和 JSON 解析处理将持久数据放置在何处。你只需要调用你想要存储的任何 JS 对象的包。

我在我的不同电子项目中使用这个包,它真的很容易。我建议使用它而不是在 'fs' 节点 API.

上挣扎

现在可以使用了。

所以基本上。 app.getPath('userData') 为您提供进入电子应用程序目录的路径,所以我一直在写入我的电子应用程序目录。

但是使用 app.getPath('appData') 获取电子应用程序目录级别的路径并且不包含它。因此不会被 electron-builder 打包,它总是在 pc 应用程序目录中。

const appDir = app.getPath('appData');

而不是

const appDir = app.getPath('userData');

这是我从杰伊那里得到的。早些时候和他聊天。他的 YouTube 频道 - ithinktechnologies

感谢@Guillaume 和@Dony 抽出时间。对我来说意义重大