如何在C#中查找并覆盖.sii文件中的指定行?
C# 实现查找并覆盖.sii文件指定行的正确方式
原代码的问题
你的代码存在两个核心问题:
- 覆盖整个文件:找到匹配行后立刻调用
File.WriteAllText,会把文件内容全部替换成当前处理的那一行,导致其他所有行丢失。 - 重复写入风险:如果文件中有多行匹配,每次匹配都会执行写入操作,最终文件只会保留最后一次匹配行的处理结果。
正确实现思路
要保留文件中其他行的同时只修改目标行,正确流程是:
- 读取文件所有行到内存
- 遍历每一行,对符合条件的行执行替换,其余行保持原样
- 将处理后的所有行整体写回文件
代码示例
string filePath = "你的文件路径"; // 读取所有行(如果文件有特殊编码,可指定Encoding参数,比如Encoding.GetEncoding("ISO-8859-1")) var lines = File.ReadAllLines(filePath); // 遍历处理每一行,构建新的行集合 var updatedLines = lines.Select(line => { if (line.Contains("my_truck_placement: (")) { // 替换目标内容,返回修改后的行 return line.Replace("my_truck_placement: ", "").Trim(); } // 不匹配的行直接返回原内容 return line; }).ToArray(); // 将处理后的所有行写回文件 File.WriteAllLines(filePath, updatedLines);
额外注意事项
- 如果.sii文件使用非默认编码(比如西欧编码),需要在
ReadAllLines和WriteAllLines中指定对应的Encoding参数,避免乱码。 - 如果需要更精确的匹配(比如避免部分匹配),可以用正则表达式代替
Contains,示例:using System.Text.RegularExpressions; // ... if (Regex.IsMatch(line, @"^my_truck_placement: \(.*\)$")) { // 执行替换逻辑 }
内容的提问来源于stack exchange,提问作者user20433809
相关产品推荐
相关产品推荐

