NodeJS中child_process结果作为路径调用fs.readFile报错问题
问题原因
你遇到的ENOENT错误核心是路径基准不统一:
exec执行find时指定了cwd: folder,所以find返回的是相对于/just/some/folder/location/的相对路径- 但
fs.readFile是基于Node进程的当前工作目录(比如你的例子里是/home/user/test/)查找文件,直接用find返回的路径,会去错误的目录下找文件,自然找不到实际存在的目标文件
另外你的路径截取代码有隐患:stdout.substring(stdout.indexOf("./") + 2).split("\n")[0]可能因为stdout格式问题(比如无./开头、多余换行)导致路径错误,建议先清理空白字符。
修复方案
把find返回的相对路径和folder拼接成绝对路径,用Node内置的path模块处理路径,避免手动拼接的错误。
具体修复步骤
- 先对
stdout做trim()处理,去除多余的换行、空格 - 用
path.join(folder, 相对路径)拼接出绝对路径,path模块会自动处理路径分隔符、./这类前缀
修复后的完整代码
var exec = require("child_process").exec, child; var fs = require('fs'); var path = require('path'); var folder = '/just/some/folder/location/'; var file = "File.txt"; console.log("Locating File...") console.log(); exec('find -name ' + file, { cwd: folder }, (error, stdout, stderr) => { if (error !== null) { console.log("Locating Failed!"); console.log(error); console.log(stderr); return; } // 清理stdout并提取第一行路径 var relativeFilePath = stdout.trim().split("\n")[0]; // 自动拼接绝对路径 var absoluteFilePath = path.join(folder, relativeFilePath); console.log("File Found: " + absoluteFilePath); console.log(); console.log("Reading File..."); fs.readFile(absoluteFilePath, 'utf8', (error, data) => { if (error) { console.log('Reading File Failed'); console.log(error); return; } console.log("File Content:", data); }); });
额外提示
- 尽量避免用
child_process执行shell命令查找文件,Node的fs模块可以实现递归遍历查找,更高效也更可控,不会出现路径基准问题 - 如果必须用
find,要处理多文件匹配、无匹配结果的情况,避免后续逻辑报错
内容的提问来源于stack exchange,提问作者Morsmalleo
相关产品推荐
相关产品推荐

