Electron用户选择文件后读取内容总是失败怎么办?
我在用Electron开发桌面应用时,让用户通过dialog选择文件后,用fs.readFileSync读取内容总报错。按照文档写的方法试过好多次还是不行。
这是我的代码片段:
const { dialog } = require('electron').remote;
const fs = require('fs');
dialog.showOpenDialog({properties: ['openFile']}).then(result => {
if (result.canceled) return;
const fileContent = fs.readFileSync(result.filePaths[0], 'utf8');
console.log(fileContent); // 这里报错说路径无效?
});
已经确认用户确实选了文件,result.filePaths里的路径看起来没问题。试过用绝对路径和相对路径都不行,错误提示是ENOTFOUND或者EACCES。是不是跨进程通信哪里搞错了?
比如:
const path = require('path');
const filePath = path.resolve(result.filePaths[0]);
const fileContent = fs.readFileSync(filePath, 'utf8');
另外,检查一下文件是否存在以及应用是否有权限访问这个文件。如果文件被其他程序占用也可能导致读取失败。
path模块处理一下,直接拿result.filePaths[0]用会有坑。尤其是跨平台的时候,路径格式容易出错。另外,
fs.readFileSync是会抛异常的,没捕获异常的话程序直接崩了也有可能导致你以为是路径问题。来,复制过去试试:
### 关键点说明:
1.
path.normalize:统一路径格式,防止斜杠不一致问题(比如 Windows 下混用了正斜杠)2.
try...catch:兜住异常,防止崩溃3. 确保你有引入
path模块,这个在 Electron 里很关键如果你用的是
或者多窗口结构,也有可能是进程路径不对,建议在主窗口控制台打印路径确认下文件是否真实存在。如果还是报
EACCES,那说明你没有读取权限,换个文件试试,或者检查下文件是否被其他程序占用。