那么,让我举一个例子来说明我的文件的外观:
Hello
my
name
is
现在,例如,我想通过System.IO.File.ReadAllLines();浏览此文件的不同行。然后用循环检查当前行是否有单词“my”(在这种情况下是第二行)。
下一步,我想在“我的”之后添加一个新行,所以它看起来像这样:
Hello
my
name
is
我现在用两种方法来解决这个问题。我希望File.Append();会提供一种方法,我可以在找到我正在寻找的字符串之后附加任何,但显然它只提供了将字符串附加到文件末尾的方法。
我的第二种方法是使用string [] test = System.IO.File.ReadAllLines()读取所有行。 然后遍历所有行,用
检查每一行for (int i = 0; i < (test.Length - 1); i++)
{
if(test[i].Contains("my"))
{
test[i] = test[i] + Environment.NewLine;
}
}
然后使用System.IO.File.WriteAllLines();将所有这些写回文件中;
我在这里遇到的问题是这个命令并没有真正为文件添加一个真正的新行,因为我已经检查过test.Length之前和之后,结果两次都得到了4。 / p>
答案 0 :(得分:1)
另一个选项是将行添加到List,它将为您提供Insert()方法: *仅用于相对较小的文件。
类似的东西:
string path = @"c:\some\path\file.txt";
List<String> lines = new List<string>(System.IO.File.ReadAllLines(path));
for (int i = 0; i < lines.Count; i++)
{
if (lines[i].Contains("my"))
{
if (i < lines.Count -1)
{
lines.Insert(i + 1, "");
}
else
{
lines.Add("");
}
}
}
System.IO.File.WriteAllLines(path, lines.ToArray());
答案 1 :(得分:0)
首先,我建议您使用StringBuilder
。当你添加许多字符串时最好使用它,因为字符串是不可变的,因此当你执行+=
时,或者只是将新的字符串分配给数组插槽时,会再次创建每个字符串。
此代码将执行您正在寻找的内容,并且它会处理无新行边缘情况:
var filePath = //your file path
var test = File.ReadAllLines(filePath);
var sb = new StringBuilder();
for (int i = 0; i < (test.Length - 1); i++)
{
sb.Append(test[i]);
sb.Append(Environment.NewLine);
if (test[i].Contains("my"))
{
// This adds that extra new line
sb.Append(Environment.NewLine);
}
}
sb.Append(test[test.Length-1]);
File.WriteAllText(filePath, sb.ToString());
答案 2 :(得分:0)
[TestMethod]
public void InsertLines()
{
var test = File.ReadAllLines(@"c:\SUService.log");
var list = new List<string>();
for (int i = 0; i < (test.Length - 1); i++)
{
list.Add(test[i]);
if (test[i].Contains("my"))
{
list.Add(Environment.NewLine);
}
}
File.WriteAllLines(@"c:\SUService.log", list);
}
答案 3 :(得分:0)
不是针对上述问题:但是通常,如果要在一行之后添加新行,只需添加新的行字符->,因此,如果要在一行之后添加空行添加2个换行符
File.WriteAllText(filePath,"\n\n");
作者在这里跳了2次,并将即将发送的内容添加到发送行中