2015-04-13 2 views
1

У меня есть файл, содержащий около 2000 строк текста, которые мне нужно добавить несколько строк. Моим первоначальным решением было просто скопировать существующий файл в новый файл, а затем добавить несколько строк в конце его. Это было до тех пор, пока я не понял, что последняя строка в файле всегда должна быть последней строкой. Поэтому теперь мне нужно добавить свои новые строки перед одной строкой текста. Я знаю, что могу просто прочитать весь файл, сохранить его в своей программе, а затем записать все в новый файл с моими дополнительными строками. Но поскольку в файле есть много строк, я хотел бы знать, был ли это лучший способ сделать это.Вставить текст в большой существующий файл

+0

С точки зрения производительности было бы намного лучше, если бы вы могли добавить новые строки в конец файла, а не добавлять их. Разумеется, вам нужно будет отменить все в своем приложении, если это необходимо. – Robert

+0

@Robert Я знаю, вот почему это было мое первоначальное решение. Но строка, которая в настоящее время является последней строкой, всегда должна быть последней строкой. –

ответ

1

Вам необходимо скопировать его в новый файл. К сожалению, нет возможности вводить данные в середину файла.

Однако для этого вам не нужно загружать его в память. Вы можете использовать StreamReader и читать только одну строку за раз, или еще лучше, метод System.IO.File.ReadLines.

int newLineIndex = 100; 
string newLineText = "Here's the new line"; 
using (var writer = new StreamWriter(outputFileName)) 
{ 
    int lineNumber = 0; 
    foreach (var line in File.ReadLines(inputFileName)) 
    { 
     if (lineNumber == newLineIndex) 
     { 
      writer.WriteLine(newLineText); 
     } 
     else if (lineNumber > 0) 
     { 
      writer.WriteLine(); 
     } 

     writer.Write(line); 

     lineNumber++; 
    } 
} 

Конечно, это становится значительно проще, если вы согласны с тем, что новая линия всегда будет иметь нулевой индекс. Если это так, у меня возникнет соблазн отказаться от этого, и просто зайдите с простым Stream.CopyTo после написания первой строки. Но это все равно должно работать.

string newLineText = "Here's the new line"; 
using (var writer = new StreamWriter(outputFileName)) 
using (var reader = File.OpenRead(inputFileName)) 
{ 
    writer.WriteLine(newLineText); 

    reader.CopyTo(writer.BaseStream); 
} 

Конечно, существует множество способов для этого, с различными компромиссами. Это всего лишь один вариант.

+0

На самом деле не имеет значения, куда идут новые строки, если они не являются последними строками в файле. И имея это в виду, вы предлагаете мне создать новый файл, записать мои новые строки в начало и затем скопировать старый файл? –

+0

@JesperEvertsson Да, это, наверное, то, что я буду делать. Я добавил немного пример того, как я, вероятно, подумал бы о том, чтобы добавить их в начало. –

+0

Я пробовал использовать второе решение, но для меня добавляет новую строку в конце файла –

0

, что я могу просто прочитать весь файл, сохранить его в своей программе, а затем записать все в новый файл с моими дополнительными строками.

Не все должно быть написано. Просто напишите вставленные строки и строки после вставленных строк в исходный файл, начиная с позиции (индекс байта) вставленных строк.

+0

Проблема заключается в том, что я не знаю, насколько велика будет файл, и он варьируется от файла к файлу. –

+0

@JesperEvertsson. Прочитайте его в своей проблеме, найдите позицию вставки и напишите новые строки и затронутые линии. –