Electron项目中Node.js读取文件失败,本地Node.js执行正常原因咨询
Electron中fs.readFile报ENOENT错误的原因及解决办法
问题描述
在Electron项目的electron-src/index.ts中,通过ipcMain监听searchSourcecode事件,调用fs.readFile读取./index.ts时出现ENOENT错误,提示文件不存在;但相同逻辑的纯Node.js代码却能成功读取目标文件。
相关代码
Electron中的报错代码:
// electron-src/index.ts import fs from 'fs' ... ipcMain.on('searchSourcecode', (event: IpcMainEvent, message: any) => { console.log(message) fs.readFile("./index.ts", "utf8",function(err, data){ console.log(err); console.log(data); event.returnValue = data }); })
错误信息:
[Error: ENOENT: no such file or directory, open './index.ts'] { errno: -2, code: 'ENOENT', syscall: 'open', path: './index.ts' }
纯Node.js成功运行代码:
var fs = require('fs') const search = () => { fs.readFile("./myComp01/index.tsx", "utf8", function(err, data){ console.log(data); }); } search()
核心原因
问题出在当前工作目录(CWD)不一致:
- 纯Node.js环境下,你直接在项目根目录执行脚本,
./对应的就是项目根目录,自然能找到目标文件。 - Electron主进程的工作目录取决于启动方式:如果用打包工具(如electron-builder、webpack)启动,或是打包后运行,主进程的工作目录会变成Electron执行文件所在的目录,而非你的项目源码目录,导致
./index.ts找不到对应文件。
另外,Electron中依赖默认工作目录的相对路径极不稳定,不同启动、打包场景下工作目录都会变化,这是这类问题的常见诱因。
解决办法
1. 使用绝对路径(推荐)
通过__dirname或path.resolve()拼接出文件的绝对路径,彻底摆脱工作目录的影响:
// electron-src/index.ts import fs from 'fs' import path from 'path' ... ipcMain.on('searchSourcecode', (event: IpcMainEvent, message: any) => { console.log(message) // __dirname代表当前脚本所在目录,根据实际目录结构调整相对路径 const targetPath = path.resolve(__dirname, '../index.ts') fs.readFile(targetPath, "utf8",function(err, data){ console.log(err); console.log(data); event.returnValue = data }); })
2. 确认并修正工作目录
如果坚持用相对路径,可以在主进程开头打印当前工作目录,确认路径是否符合预期:
console.log(process.cwd()) // 输出当前工作目录
之后要么调整启动Electron时的工作目录,要么根据实际输出修改相对路径。
内容的提问来源于stack exchange,提问作者qg_java_17137
相关产品推荐
相关产品推荐

