如何使用electron的app.getPath()来存储数据?

ioekq8ef  于 2022-12-08  发布在  Electron
关注(0)|答案(6)|浏览(417)

我想在用户的计算机上存储图像,所以我认为它应该存储在用户的数据文件夹中,如这里所述。

一月一日

name。传回字串-与name相关之特殊目录或档案的路径。失败时会掷回错误。您可以依名称要求下列路径:

  • home用户的主目录
  • appData每个用户的应用程序数据目录,默认情况下指向:

Windows $XDG_CONFIG_HOME上的%APPDATA%或Linux上的~/.config ~/macOS上的资源库/应用程序支持

  • userData用于存储应用配置文件的目录,默认情况下为appData目录并附加应用名称。
  • ...

我觉得你应该这么做

const app = require('electron');
alert(app.getPath('userData'));

但是我得到了“getPath不是函数”。我不知道把它放在哪里。它不能从我的html文件或渲染器文件中工作,我不知道如何从主文件中使用它,因为它没有链接到网页。

wqsoz72f

wqsoz72f1#

由于remote方法被认为是过时的,如here所示,我建议您这样做:

const {app} = require('electron');
console.log(app.getPath('userData'));
rur96b6h

rur96b6h2#

remote被视为危险。
app.getPathmain进程中始终可用。
以下是如何在渲染器进程中完成此操作而不使用remote(electron 7+)
基本上你必须在渲染器中使用invoke
main为单位

ipcMain.handle('read-user-data', async (event, fileName) => {
  const path = electron.app.getPath('userData');
  const buf = await fs.promises.readFile(`${path}/${fileName}`));
  return buf;
})

renderer为单位

ipcRenderer.invoke('read-user-data', 'fileName.txt').then(
  result => doSomething()
);
ldfqzlk8

ldfqzlk83#

下面是我需要在开发和发布之间切换时使用的方法

const electron = require('electron');
export const userDataPath = (electron.app || electron.remote.app).getPath(
  'userData'
);
wdebmtf2

wdebmtf24#

防止“getPath is not a function”错误的另一种方法是使代码在渲染器进程和主进程中都能工作:

const electron = require('electron');

const configDir =  (electron.app || electron.remote.app).getPath('userData');
console.log(configDir);
58wvjzkj

58wvjzkj5#

我在使用app.getPath('userData')来保存/加载配置文件等方面遇到了麻烦,最终在此期间使用了操作系统特定的env变量:

const getAppBasePath = () => {
        //dev
    if (process.env.RUN_ENV === 'development') return './'

    if (!process.platform || !['win32', 'darwin'].includes(process.platform)) {
        console.error(`Unsupported OS: ${process.platform}`)
        return './'
    }
        //prod
    if (process.platform === 'darwin') {
        console.log('Mac OS detected')
        return `/Users/${process.env.USER}/Library/Application\ Support/${YOUR_APP_NAME}/`
    } else if (process.platform === 'win32') {
        console.log('Windows OS detected')
        return `${process.env.LOCALAPPDATA}\\${YOUR_APP_NAME}\\`
    }
}
gorkyyrv

gorkyyrv6#

如果您想在渲染器进程中执行此操作,请尝试此操作,它对我很有效

// main.js

const electron = require('electron')

const electronRemote = process.type === 'browser' ? electron : 
require('@electron/remote')

const { app, ipcMain, Menu, globalShortcut } = require('electron')

const BrowserWindow = electronRemote.BrowserWindow

const isDev= require('electron-is-dev')

const { initialize, enable } = require('@electron/remote/main')

initialize()

let mainWindow

app.on('ready', ()=>{
   mainWindow = new BrowserWindow({
     width: 1024,
     height: 600,
     minWidth:600,
     webPreferences: {
        nodeIntegration: true,
        enableRemoteModule: true,
        contextIsolation: false
     }
   })
   enable(mainWindow.webContents)

})

渲染过程

// render process
const { app } = window.require('@electron/remote')
const savedPath = app.getPath('userData')

相关问题