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
文件夹在 运行 您的应用程序时不存在。因此,您的所有变量 isSizeDir
、isPosDir
等都是 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 抽出时间。对我来说意义重大
我创建了一个具有用户 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
文件夹在 运行 您的应用程序时不存在。因此,您的所有变量 isSizeDir
、isPosDir
等都是 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 抽出时间。对我来说意义重大