Electron中的各种路径全解析

在 Electron 开发中,路径管理是一件非常重要的事情。
无论是保存配置文件、加载静态资源、还是存储日志、数据库,都需要明确知道文件该放在哪里。

Electron 为我们提供了多种路径获取 API,比如:

  • app.getPath(name)
  • app.getAppPath()
  • process.resourcesPath
  • path.resolve() / import.meta.url
  • __dirname / __filename

本文将全面总结这些路径的作用、区别、适用场景与最佳实践。


一、app.getPath(name) —— 系统路径大全

这是 Electron 提供的最常用路径 API,用于获取 操作系统标准目录 的实际路径。

基本用法

import { app } from 'electron'

app.whenReady().then(() => {
  console.log('userData =>', app.getPath('userData'))
})

返回的是一个绝对路径字符串。


全部可用的 name 参数

参数名说明Windows 示例macOS 示例Linux 示例
home用户主目录C:\Users\<User>/Users/<User>/home/<User>
appData应用数据根目录(系统级)C:\Users\<User>\AppData\Roaming/Users/<User>/Library/Application Support/home/<User>/.config
userData当前应用专属目录C:\Users\<User>\AppData\Roaming\<App>/Users/<User>/Library/Application Support/<App>/home/<User>/.config/<App>
sessionData当前会话数据目录临时临时临时
temp系统临时目录C:\Users\<User>\AppData\Local\Temp/var/folders/.../T//tmp
exe应用主进程可执行文件路径C:\Program Files\<App>\<App>.exe/Applications/<App>.app/.../usr/bin/<App>
moduleElectron 模块所在路径Electron 安装目录同上同上
desktop桌面目录C:\Users\<User>\Desktop/Users/<User>/Desktop/home/<User>/Desktop
documents文档目录C:\Users\<User>\Documents/Users/<User>/Documents/home/<User>/Documents
downloads下载目录C:\Users\<User>\Downloads/Users/<User>/Downloads/home/<User>/Downloads
music音乐目录C:\Users\<User>\Music/Users/<User>/Music/home/<User>/Music
pictures图片目录C:\Users\<User>\Pictures/Users/<User>/Pictures/home/<User>/Pictures
videos视频目录C:\Users\<User>\Videos/Users/<User>/Movies/home/<User>/Videos
recent最近打开的文件C:\Users\<User>\AppData\Roaming\Microsoft\Windows\Recent/Users/<User>/Library/Recent Documents
logs日志文件目录C:\Users\<User>\AppData\Roaming\<App>\logs/Users/<User>/Library/Logs/<App>/home/<User>/.config/<App>/logs
crashDumps崩溃日志目录C:\Users\<User>\AppData\Local\Temp\<App> Crashes/Users/<User>/Library/Logs/<App> Crashes/home/<User>/.config/<App>/Crash Reports
pepperFlashSystemPluginFlash 插件路径(已弃用)

常见场景示例

1. 保存配置文件
import path from 'path'
import { app } from 'electron'

const configPath = path.join(app.getPath('userData'), 'config.json')
2. 保存日志文件
import path from 'path'
import { app } from 'electron'

const logDir = app.getPath('logs')
const logFile = path.join(logDir, 'main.log')
3. 保存临时文件
import fs from 'fs'
import path from 'path'
import { app } from 'electron'

const tempFile = path.join(app.getPath('temp'), 'temp.png')
fs.writeFileSync(tempFile, buffer)

修改路径:app.setPath(name, newPath)

可在应用启动早期(app.whenReady() 之前)修改默认路径,例如实现便携模式:

import { app } from 'electron'
import path from 'path'

const portableDir = path.join(process.cwd(), 'data')
app.setPath('userData', portableDir)

二、app.getAppPath() —— 获取应用代码路径

app.getAppPath() 返回应用的 根目录路径,也就是包含 package.json 的目录。

常用于加载资源、配置文件或 DLL。

import { app } from 'electron'

console.log(app.getAppPath())
// 示例: C:\Users\<User>\AppData\Local\Programs\<App>\resources\app.asar

⚠️ 如果应用被打包为 app.asar,返回的路径会包含 .asar 文件。
若需要访问解压后的文件,请使用:

import path from 'path'
import { app } from 'electron'

const realPath = path.join(process.resourcesPath, 'app.asar.unpacked')

三、process.resourcesPath —— 应用资源目录

process.resourcesPath 是打包后 resources 目录 的实际路径。

环境示例路径
开发环境<project_root>
打包后C:\Program Files\<App>\resources

例如:

import path from 'path'

const dllPath = path.join(process.resourcesPath, 'mydll.dll')

在 Electron Builder 打包时,extraResourcesasarUnpack 中的文件也会放在此目录中。


四、__dirnameimport.meta.url

在主进程中加载本地文件时,也可以使用 Node.js 的路径工具。

CommonJS 模块

console.log(__dirname)  // 当前 JS 文件所在目录

ESM 模块(如 TypeScript 或 "type": "module"

import { fileURLToPath } from 'url'
import path from 'path'

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

五、渲染进程路径加载

在渲染进程中(BrowserWindow 里),路径的使用稍有不同:

加载 HTML 文件

mainWindow.loadFile('index.html')

加载本地 URL(支持相对路径)

import path from 'path'
import { fileURLToPath } from 'url'

const indexPath = path.join(__dirname, '../renderer/index.html')
mainWindow.loadURL(`file://${indexPath}`)

六、path.resolve()path.join() 对比

方法作用示例结果
path.join()简单拼接路径path.join('a','b','c')'a/b/c'
path.resolve()根据当前工作目录解析为绝对路径path.resolve('a','b')C:/project/a/b

🧠 七、总结:Electron 路径速查表

类型API示例常见用途
用户目录app.getPath('home')C:\Users\<User>用户数据根目录
应用数据app.getPath('userData').../AppData/Roaming/<App>保存配置与数据库
临时文件app.getPath('temp')/tmp缓存、截图等临时文件
日志目录app.getPath('logs').../Logs/<App>日志输出
可执行文件app.getPath('exe')<App>.exe检查安装位置
应用根目录app.getAppPath()resources/app.asar获取主代码目录
资源目录process.resourcesPathresources/访问额外文件或 DLL
当前文件路径__dirname / import.meta.url-加载相对路径资源
临时解析path.join() / path.resolve()-拼接或解析路径

八、实用调试代码:打印所有路径

import { app } from 'electron'

app.whenReady().then(() => {
  const keys = app.getPathNames() ?? [
    'home', 'appData', 'userData', 'temp', 'exe', 'desktop', 'documents',
    'downloads', 'music', 'pictures', 'videos', 'logs', 'crashDumps'
  ]
  keys.forEach(name => {
    console.log(name, '=>', app.getPath(name))
  })
  console.log('appPath =>', app.getAppPath())
  console.log('resourcesPath =>', process.resourcesPath)
})

结语

Electron 的路径系统虽然看起来繁多,但掌握它们的职责分工,就能轻松实现:

  • 跨平台存储配置与日志
  • 访问打包后的资源文件
  • 实现 portable 便携运行模式
  • 安全加载静态资源与模块

在下一次写 Electron 代码时,别再写死路径,试试用这些 API —— 你的代码将更优雅、更通用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光芒万丈向远方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值