Ответ 1
Вы не можете переписать строку без перезаписи всего файла (если строки не имеют одинаковой длины). Если ваши файлы малы, тогда чтение всего целевого файла в память и последующее его повторное использование могут иметь смысл. Вы можете сделать это вот так:
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
int line_to_edit = 2; // Warning: 1-based indexing!
string sourceFile = "source.txt";
string destinationFile = "target.txt";
// Read the appropriate line from the file.
string lineToWrite = null;
using (StreamReader reader = new StreamReader(sourceFile))
{
for (int i = 1; i <= line_to_edit; ++i)
lineToWrite = reader.ReadLine();
}
if (lineToWrite == null)
throw new InvalidDataException("Line does not exist in " + sourceFile);
// Read the old file.
string[] lines = File.ReadAllLines(destinationFile);
// Write the new file over the old file.
using (StreamWriter writer = new StreamWriter(destinationFile))
{
for (int currentLine = 1; currentLine <= lines.Length; ++currentLine)
{
if (currentLine == line_to_edit)
{
writer.WriteLine(lineToWrite);
}
else
{
writer.WriteLine(lines[currentLine - 1]);
}
}
}
}
}
Если ваши файлы большие, было бы лучше создать новый файл, чтобы вы могли читать потоки из одного файла во время записи в другой. Это означает, что вам не обязательно иметь весь файл в памяти сразу. Вы можете сделать это вот так:
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
int line_to_edit = 2;
string sourceFile = "source.txt";
string destinationFile = "target.txt";
string tempFile = "target2.txt";
// Read the appropriate line from the file.
string lineToWrite = null;
using (StreamReader reader = new StreamReader(sourceFile))
{
for (int i = 1; i <= line_to_edit; ++i)
lineToWrite = reader.ReadLine();
}
if (lineToWrite == null)
throw new InvalidDataException("Line does not exist in " + sourceFile);
// Read from the target file and write to a new file.
int line_number = 1;
string line = null;
using (StreamReader reader = new StreamReader(destinationFile))
using (StreamWriter writer = new StreamWriter(tempFile))
{
while ((line = reader.ReadLine()) != null)
{
if (line_number == line_to_edit)
{
writer.WriteLine(lineToWrite);
}
else
{
writer.WriteLine(line);
}
line_number++;
}
}
// TODO: Delete the old file and replace it with the new file here.
}
}
После этого вы можете переместить файл, как только убедитесь, что операция записи выполнена успешно (исключение не было отменено и автор закрыт).
Обратите внимание, что в обоих случаях это немного запутывает то, что вы используете индексирование на основе 1 для своих номеров строк. В коде может быть больше смысла использовать индексирование на основе 0. Вы можете иметь индекс на основе 1 в своем пользовательском интерфейсе для своей программы, если хотите, но преобразовать его в индекс с индексированием по 0, прежде чем отправлять его дальше.
Кроме того, недостатком прямой перезаписи старого файла с новым файлом является то, что если он терпит неудачу на полпути, вы можете навсегда потерять все данные, которые не были записаны. При записи в третий файл сначала вы удаляете только исходные данные после того, как убедитесь, что у вас есть другая (скорректированная) копия, поэтому вы можете восстановить данные, если компьютер выйдет наполовину.
Последнее замечание: я заметил, что ваши файлы имеют расширение xml. Возможно, вам стоит подумать, имеет ли смысл использовать XML-парсер для изменения содержимого файлов вместо замены определенных строк.