Поэтому позвольте мне привести пример моего файла:
Hello
my
name
is
Теперь, например, я хочу просмотреть различные строки этого файла с помощью System.IO.File.ReadAllLines(); а затем проверить с помощью цикла, имеет ли текущая строка слово "мое" в нем (так что вторая строка в этом случае).
В качестве следующего шага я хочу добавить новую строку сразу после "моего", так что она выглядит так:
Hello
my
name
is
Я подошел к этому с помощью двух методов. Я надеялся на File.Append(); предложит метод, в котором я мог бы добавить что-либо после того, как нашел строку, которую я ищу, но, очевидно, она предлагает только методы добавления строк в конец файлов.
Мой второй подход состоял в том, чтобы читать во всех строках со строкой [] 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 в результате.
Другой вариант - добавить строки в список, который даст вам метод 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());
Во-первых, я предлагаю вам использовать 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());
[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);
}