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

Electron中判断文件存在时返回undefined问题求助

问题分析与解决方案

你的代码存在两个关键问题,导致始终返回undefined:

1. Preload脚本未返回IPC调用的Promise

preload.js中的fsStat函数没有返回ipcRenderer.invoke的执行结果,这会让renderer中await的是一个无返回值的函数,最终得到undefined。

2. Main进程中文件状态检查的逻辑错误

  • 原生fs.stat是回调式API,直接赋值const stats = fs.stat(databaseLocation)无法获取有效文件状态对象;
  • 捕获错误后仅打印日志,未返回false,导致文件不存在时无返回值,同样会得到undefined。

修正后的完整代码

preload.js

const { contextBridge, ipcRenderer } = require('electron');

const WINDOW_API = {
  log: (args) => console.log(args),
  fsStat: (databaseLocation) => {
    // 返回invoke的Promise,让renderer可以await结果
    return ipcRenderer.invoke('checkDbLocation', databaseLocation);
  }
}

contextBridge.exposeInMainWorld('api', WINDOW_API);

main.js(同步版本)

const fs = require('fs');
const { ipcMain } = require('electron');

ipcMain.handle('checkDbLocation', (event, databaseLocation) => {
  try {
    // 使用同步API获取文件状态
    const stats = fs.statSync(databaseLocation);
    return stats.isFile();
  } catch (err) {
    console.log(err);
    return false; // 文件不存在或出错时返回false
  }
});

main.js(异步Promise版本,推荐,避免阻塞主进程)

const fs = require('fs').promises;
const { ipcMain } = require('electron');

ipcMain.handle('checkDbLocation', async (event, databaseLocation) => {
  try {
    const stats = await fs.stat(databaseLocation);
    return stats.isFile();
  } catch (err) {
    console.log(err);
    return false;
  }
});

renderer.js(确保Button为页面有效DOM元素)

const Button = document.getElementById('your-button-id');
Button.addEventListener('click', async () => {
  window.api.minimizeWindow();
  let result = await window.api.fsStat("C:\\Users\\workspace\\Downloads\\ChromeSetup.exe");
  window.api.log(result); // 现在会输出true或false
})

内容的提问来源于stack exchange,提问作者gloomn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:55:25