Node.js批量替换txt文件多组词汇仅单条规则生效问题
问题产生原因
- 核心原因是异步写入的竞态覆盖:
fs.writeFile是异步非阻塞接口,原代码里两次替换都是直接拿最开始读到的原始文件内容生成结果,同时发起两个对同一个文件的写入请求,最后执行完成的写入(也就是School替换为College的逻辑)会直接把前一次写入的内容完全覆盖,这也是为什么只有第二条规则生效。 - 替换逻辑没有做链式传递:两次替换都是从原始未修改的内容出发,没有基于前一次替换后的结果执行下一轮替换,天然没法叠加多组替换规则。
- 代码本身缺失第三条
banana替换为Mango的规则,自然不会生效。 - 存在不规范写法:循环里重复写
var fs = require('fs')属于冗余代码,虽然Node模块缓存机制不会重复加载模块,但完全没有必要。 - 存在路径隐患:
fs.readdir返回的只是文件名,不是完整绝对路径,直接传给读写API的话,如果脚本运行时的工作目录和脚本所在目录不一致,会直接报找不到文件的错误。
修正后完整代码
const path = require('path') const fs = require('fs') const dirpath = path.join(__dirname, '/') fs.readdir(dirpath, function(err, files) { if (err) return console.log('读取目录失败:', err) // 筛选所有txt格式文件 const txtFiles = files.filter(el => path.extname(el) === '.txt') for (let i = 0; i < txtFiles.length; i++) { // 拼接文件完整绝对路径,避免路径匹配错误 const targetFile = path.join(dirpath, txtFiles[i]) console.log('开始处理:', txtFiles[i]) fs.readFile(targetFile, 'utf8', function (err, fileContent) { if (err) return console.log('读取文件失败:', err) // 链式执行所有替换规则,一次生成最终内容 const replacedContent = fileContent .replace(/mobile/g, 'laptop') .replace(/School/g, 'College') .replace(/banana/g, 'Mango') // 所有替换完成后只执行一次写入,从根源避免多写入请求的覆盖问题 fs.writeFile(targetFile, replacedContent, 'utf8', function (err) { if (err) return console.log('写入文件失败:', err) console.log('处理完成:', txtFiles[i]) }) }) } })
内容的提问来源于stack exchange,提问作者Riyan
相关产品推荐
相关产品推荐

