You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js逐行处理文件追加输出时行顺序错乱、换行异常问题求助

问题根因

  • 核心问题是你使用了异步的fs.appendFile执行写入操作,Node.js的异步IO回调执行顺序不保证和调用顺序一致,导致行写入顺序随机错乱
  • 旧文件删除逻辑fs.unlink也是异步操作,可能还没完成删除就已经开始写入新内容,出现内容异常
  • 统一强制替换所有换行符后加\n,如果原文件是Windows格式的\r\n换行,会导致换行格式不符合预期,也可能出现看起来换行缺失的问题

修复方案

  1. 优先用同步API处理旧文件清理,保证删除完成后再执行后续读写逻辑
  2. 不要逐行异步追加,先把所有处理后的行按顺序存到数组里,全部读取完成后一次性写入文件,既保证顺序又减少IO开销
  3. 可根据实际需求调整换行格式,适配不同系统的文件规范

修改后的参考代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:15:04