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

C#批量修改多文件指定行:实现替换而非追加写入

实现文件内容的行替换功能

你的代码问题出在StreamWriter的追加模式和逻辑上的重复写入,以下是修正后的方案,直接实现替换对应行的功能:

原代码的核心问题

  • StreamWriter(file, true)里的true表示追加模式,会把修改后的内容加到文件末尾,而非替换原内容
  • 第一个判断里的*是普通字符,Contains("package gg.rsmod.plugins.content.npcs.npcInfo.*")无法匹配实际的package行
  • 多个独立的if会让同一行被多次写入(比如含aggroTimer的行会被写入两次)

修正后的代码

string folderPath = "other";

foreach (string file in Directory.EnumerateFiles(folderPath, "*.plugin.kts"))
{
    // 一次性读取文件所有行
    string[] lines = File.ReadAllLines(file);
    List<string> modifiedLines = new List<string>();

    foreach (string line in lines)
    {
        string currentLine = line;

        // 匹配package前缀的行,替换指定内容
        if (currentLine.StartsWith("package gg.rsmod.plugins.content.npcs.npcInfo."))
        {
            currentLine = currentLine.Replace(
                "package gg.rsmod.plugins.content.npcs.npcInfo.wyrm", 
                "package gg.rsmod.plugins.content.npcs.npcInfo.other");
        }

        // 移除aggroTimer和aggroMinutes字符串
        if (currentLine.Contains("aggroTimer"))
        {
            currentLine = currentLine.Replace("aggroTimer", "");
        }
        if (currentLine.Contains("aggroMinutes"))
        {
            currentLine = currentLine.Replace("aggroMinutes", "");
        }

        // 将修改后的行加入列表
        modifiedLines.Add(currentLine);
    }

    // 把修改后的所有行写回文件,直接覆盖原内容
    File.WriteAllLines(file, modifiedLines);
    Console.WriteLine($"处理完成:{file}");
}

Console.ReadLine();

关键修改说明

  1. 替换而非追加:用File.WriteAllLines直接覆盖原文件,确保修改后的内容完全替换原文件内容
  2. 精准匹配package行:用StartsWith替代带*的Contains,准确匹配目标package行(如果需要匹配任意包含该前缀的行,也可以用Contains("package gg.rsmod.plugins.content.npcs.npcInfo."))
  3. 避免重复写入:对每一行只做一次修改,最终只添加一次到结果列表,保证文件每行只对应修改后的一行
  4. 批量处理更高效:先读取所有行到内存,处理完成后一次性写入,比边读边写更稳定,适合批量处理大量文件

内容的提问来源于stack exchange,提问作者Ian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:06:15