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

141
18 апреля 2022, 07:50

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

Answer 1

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

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

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

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");

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

READ ALSO
Вопрос по синтаксису вызова делегата в c# [дубликат]

Вопрос по синтаксису вызова делегата в c# [дубликат]

В общем, имеются в программе события, одно из них-CollectionCountChanged, которое генерируется функцией OnCollectionCountChanged:

123
Как переписать данные файла

Как переписать данные файла

Формат содержимого файла: дата,фамилия сотрудника,кол-во часов роботы,проделанная работа

182
Путь содержит недопустимые знаки C#

Путь содержит недопустимые знаки C#

При обращении к файлу выдает исключение:

163
Unity Вопрос про Scene и Game

Unity Вопрос про Scene и Game

подскажите, может кто знает, почему когда запускаешь Game в Unity вся механика игры работает, а когда пытаешься реализовать механику в окне Scene ничего...

145