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();
关键修改说明
- 替换而非追加:用
File.WriteAllLines直接覆盖原文件,确保修改后的内容完全替换原文件内容 - 精准匹配package行:用
StartsWith替代带*的Contains,准确匹配目标package行(如果需要匹配任意包含该前缀的行,也可以用Contains("package gg.rsmod.plugins.content.npcs.npcInfo.")) - 避免重复写入:对每一行只做一次修改,最终只添加一次到结果列表,保证文件每行只对应修改后的一行
- 批量处理更高效:先读取所有行到内存,处理完成后一次性写入,比边读边写更稳定,适合批量处理大量文件
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

