C#使用StreamWriter,在特定行附加一个字符串

C# Using StreamWriter, append a string in a specific line

我想用 C# 和 StreamReader/StreamWriter 操作文件。最初,我需要找到一些特定的行,然后在它们之后附加一个字符串。使用这段代码,我可以找到我想在它们之后写的行。

            string[] targetValues = {"firstTargetValue"};

            List<int> nlines = new List<int>();
            string[] newValues = {"firstNewValue" };

            int j = 1; //1-based indexing
            StreamReader sr = new StreamReader(filepath);
            string line = sr.ReadLine();

            while (line != null)
            {

                line = sr.ReadLine();
                j++;

                if (line == targetValues[0])
                {
                    nlines.Add(j);
                }
            } 
            sr.Close();

所以现在我有行号 ( j=5 )。对于最后一部分,我想在此行之后而不是文件末尾写入我的字符串。

            var sw = new StreamWriter(filepath,true);

            sw.WriteLine(newValues[0]);
            sw.Close();

我能否以某种方式使用具有行号的 j 来实现我的目标?

文本示例:

初始文件

1
2
3
4
firstTargetValue
6
7
8

想要的文件

1
2
3
4
firstTargetValue
firstNewValue
6
7
8

在此先感谢,我找不到适合我的答案

你不能用 StreamWriter 做到这一点,但是......为什么不使用另一个流写入器来写出旧文件的内容,直到你要插入新文件的行,然后写入现有文件的其余部分?那就用File的静态方法把旧的删掉,新的重命名为旧的就可以了。

这可能是一个可能的解决方案:

var input = File.ReadAllLines(filepath);
var output = new List<string>();

foreach (var line in input)
{
    output.Add(line);

    if (line == "firstTargetValue")
    {
        output.Add("firstNewValue");
    }
}

output.ForEach(line => Console.WriteLine(line));

如果不重写整个文件,就不能重写一行。如果文件很小,那么将整个内容读入内存然后再次写出可能是有意义的。

using System.IO;
using System.Linq;
    
public void InsertToFile(string[] targetValues) 
{
    string filePath = "filePath";
    var txtLines = File.ReadAllLines(filePath).ToList();
    foreach (var target in targetValues)
    {
        txtLines.Insert(txtLines.IndexOf(target), "//new line to be inserted");
    }
    File.WriteAllLines(filePath, txtLines);
}

另一种解决方法是将 targetValue 替换为 (targetvale + newValue)

using System.IO;
    
public void InsertToFile(string[] targetValues) 
{
    string filePath = "filePath";
    var text = File.ReadAllText(filePath); 
    foreach (var target in targetValues)
        text.Replace(target, $"{target} new value to be inserted");
    File.WriteAllText(filePath, text);
}