NodeJS中readFileSync读取其他目录文件返回值输出为空是什么原因?
核心原因
readStream.pipe(writeStream)属于异步流式操作,代码执行到这一行后不会等待文件写入完成,会立刻向下执行readFileSync读取逻辑。此时./data/info2.txt还在写入过程中,要么没有写入任何内容,要么文件句柄未被正常关闭,因此读取结果为空。
之前将txt文件放在同级目录可正常读取,是因为对应文件已经提前完成写入,不存在异步时序冲突。
修复方案
仅需要将同步读取逻辑放到写入流的finish事件回调中,保证写入完全结束后再执行读取即可,完全符合同步读取的使用要求:
const fs = require('fs'); const path = require('path'); try { const readStream = fs.createReadStream('./info.txt', 'utf8'); const writeStream = fs.createWriteStream('./data/info2.txt', 'utf8'); readStream.pipe(writeStream); // 等待写入流完全结束后再执行读取 writeStream.on('finish', () => { let file = fs.readFileSync( './data/info2.txt', 'utf8'); console.log(file.toString()); }); } catch (error) { if (error) console.log(error); }
路径优化建议
硬编码的相对路径./data/info2.txt是相对于执行node命令的工作目录解析的,如果你在其他目录下执行该JS文件会出现路径找不到的问题。可以替换为path.resolve(__dirname, './data/info2.txt'),路径会自动按照当前JS文件的所在目录解析,兼容性更好。
内容的提问来源于stack exchange,提问作者Nagusameta
相关产品推荐
相关产品推荐

