You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:53:28