C# переписать строку в файле

Пользователь создаёт запись в файле. Далее, если нужно, он может переписать нужную запись. Как сделать грамотно перезапись строки, чтобы не нужно было переписывать целый файл, в котором может быть тысячи строк?


Ответы (1 шт):

Автор решения: aepot

При условии, что строки произволной длины. Мне кажется, можно и перезаписывать, если файл не огромный. "Тысячи строк" не выглядит страшно.

Главное - стараться не читать весь файл в память для этого.

Этот метод перезапишет одну строку в файле по ее индексу.

private static void RewriteLine(string path, int lineIndex, string newValue)
{
    int i = 0;
    string tempPath = path + ".tmp";
    using (StreamReader sr = new StreamReader(path)) // читаем
    using (StreamWriter sw = new StreamWriter(tempPath)) // и сразу же пишем во временный файл
    {
        while (!sr.EndOfStream)
        {
            string line = sr.ReadLine();
            if (lineIndex == i)
                sw.WriteLine(newValue);
            else
                sw.WriteLine(line);
            i++;
        }
    }
    File.Delete(path); // удаляем старый файл
    File.Move(tempPath, path); // переименовываем временный файл
}

Должно работать очень быстро, настолько, насколько диск позволяет. Если файл нормально разбит на строки, то и памяти съест немного.

Можно еще доработать, чтобы строка дописывалась в конец, если индекс строки больше, чем строк в исходном файле.

RewriteLine("file.txt", 1, "New string");

Для того, чтобы менять данные в файле не перезаписывая файл целиком, надо либо иметь строки фиксированной длины, тогда можно будет просто по нужному смещению записать нужный текст, либо реализовывать таблицу размещения данных с поддержкой фрагментации, по подобию (любой) файловой системы.

→ Ссылка