我正在构建并尝试部署打包的电子应用程序。对于我使用的包装
electron-packager
electron-installer-debian
electron-installer-dmg
electron-winstaller
我面临一个小问题,我必须将应用程序数据存储在我的用户计算机中的某个位置。
我看到好的做法是使用电子方法返回的路径中的文件夹
app.getPath('userData')
。
来自文档 存放应用程序配置文件的目录,默认为
appData
目录加上应用程序名称。
%APPDATA% on Windows
$XDG_CONFIG_HOME or ~/.config on Linux
~/Library/Application Support on macOS
根据我的测试,有时安装应用程序时不会自动创建此文件夹,有时是的,我想知道是否应该创建它。
现在,如果电脑中不存在此文件夹,我将退出应用程序,并使用以下代码
var DatasPath = app.getPath('userData')
if (!fs.existsSync(DatasPath)){
process.exit()
}
所以问题是
DatasPath
文件夹不存在或“这样做是不好的做法”时,我是否应该使用 fs.mkdirSync(DatasPath);
文件夹创建它,如果我可以创建该文件夹,我必须警告用户我刚刚添加了该文件夹? (将我的回复从“评论”扩展为“答案”)
我不知道我是否应该创建它,所以我会自动创建它 如果没有该文件夹,请退出应用程序
您似乎太字面地理解了“userData”?它不是一个名为“userData”的实际“文件夹”——它是操作系统为 that 应用程序存储数据的路径。
Electron
目前在 3 个操作系统上运行,每个操作系统的功能都不同。为了我们的方便,Electron通过创建包装器方法 app.getPath(name) 隐藏这些差异,以便相同的代码可以在每个操作系统上运行。
试试这个:将下面的行放入您的
main.js
脚本中:
console.log(app.getPath('userData'));
/用户/*********/库/应用程序支持/MyCoolApp
(“************”将是您的用户帐户名。)
更新:
在
main.js
中运行下面的代码,然后在“userData”路径指定的文件夹中查找
const fs = require("fs");
const path = require('path');
var datasPath = app.getPath('userData')
var data = "I am the cheese"
var filePath = path.join(datasPath, "savedData.txt")
fs.writeFileSync(filePath, data)
在
pathConfig.js
function getAppDataPath() {
switch (process.platform) {
case "darwin": {
return path.join(process.env.HOME, "Library", "Application Support", "myApp");
}
case "win32": {
return path.join(process.env.APPDATA, "myApp");
}
case "linux": {
return path.join(process.env.HOME, ".myApp");
}
default: {
console.log("Unsupported platform!");
process.exit(1);
}
}
}
const appPath = __dirname;
const appDataPath =
!process.env.NODE_ENV || process.env.NODE_ENV === "production"
? getAppDataPath() // Live Mode
: path.join(appPath, "AppData"); // Dev Mode
if (!fs.existsSync(appDataPath)) {
// If the AppData dir doesn't exist at expected Path. Then Create
// Maybe the case when the user runs the app first.
fs.mkdirSync(appDataPath);
}
在每个操作系统中,appData 文件夹都有不同的路径,获取此路径的完美方法是在主进程中调用 app.getPath('userData') 。 但是有一个包可以为您处理这个问题,它将数据存储在 JSON 文件中并在每次更改时更新它。 在我看来,这个包比你自己处理所有事情要好得多。 阅读更多 : https://www.npmjs.com/package/electron-data-holder