Node.js逐行处理文件追加输出时行顺序错乱、换行异常问题求助
问题根因
- 核心问题是你使用了异步的
fs.appendFile执行写入操作,Node.js的异步IO回调执行顺序不保证和调用顺序一致,导致行写入顺序随机错乱 - 旧文件删除逻辑
fs.unlink也是异步操作,可能还没完成删除就已经开始写入新内容,出现内容异常 - 统一强制替换所有换行符后加
\n,如果原文件是Windows格式的\r\n换行,会导致换行格式不符合预期,也可能出现看起来换行缺失的问题
修复方案
- 优先用同步API处理旧文件清理,保证删除完成后再执行后续读写逻辑
- 不要逐行异步追加,先把所有处理后的行按顺序存到数组里,全部读取完成后一次性写入文件,既保证顺序又减少IO开销
- 可根据实际需求调整换行格式,适配不同系统的文件规范
修改后的参考代码:
const settings = require('../settings.json') const lineReader = require('line-reader'); const Promise = require('bluebird'); const fs = require('fs') const eachLine = Promise.promisify(lineReader.eachLine); function makeid(length) { var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; var charactersLength = characters.length; for ( var i = 0; i < length; i++ ) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } // 同步清理旧文件,避免异步冲突 try { fs.unlinkSync('./unblacklisted.rbxlx') } catch (err) { // 文件不存在直接忽略,其他错误抛出 if (err.code !== 'ENOENT') throw err } // 按顺序存储所有处理后的行 const processedLines = [] eachLine(`./${settings['CorrectMapName/fileName']}`, function(line) { // 移除当前行自带的换行符 let treatedline = line.replace(/(\r\n|\n|\r)/gm, ""); if (typeof line.split('referent=')[1] !== 'undefined') { const referentPart = treatedline.split('referent=')[1] treatedline = treatedline.replace(referentPart, `"RBX${Buffer.from(makeid(17), 'ascii').toString('hex').toUpperCase()}">`) } processedLines.push(treatedline) }).then(function() { // 所有行处理完成后一次性写入,需要Windows换行格式可将'\n'替换为'\r\n' fs.writeFileSync('./unblacklisted.rbxlx', processedLines.join('\n') + '\n') __callback() })
内容的提问来源于stack exchange,提问作者Calum Griffiths
相关产品推荐
相关产品推荐

