在 Electron 开发中,路径管理是一件非常重要的事情。
无论是保存配置文件、加载静态资源、还是存储日志、数据库,都需要明确知道文件该放在哪里。
Electron 为我们提供了多种路径获取 API,比如:
app.getPath(name)app.getAppPath()process.resourcesPathpath.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> |
module | Electron 模块所在路径 | 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 |
pepperFlashSystemPlugin | Flash 插件路径(已弃用) |
常见场景示例
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 打包时,extraResources 或 asarUnpack 中的文件也会放在此目录中。
四、__dirname 与 import.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.resourcesPath | resources/ | 访问额外文件或 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 —— 你的代码将更优雅、更通用!
4334

被折叠的 条评论
为什么被折叠?



