Записать файл в определенную строку без цикла

В С # я ​​хочу получить доступ к определенной строке файла, чтобы переписать ее, не изменяя остальную часть. Собственно так:

using (StreamWriter writer = new StreamWriter(myfile))
{
    for (int currentLine = 1; currentLine <= lines.Length; ++currentLine)
    {
        if (currentLine == Linetoedit)
        {
             writer.WriteLine(stufftowrite);
             return;
        }
        else
        {
            //do nothing
        }
    }
}

Проблема в том, что файл может быть большим, поэтому я опасаюсь, что это может замедлить работу системы. Любое решение, позволяющее избежать цикла и получить более прямой доступ к нужной строке в файле?


person Restro Fad    schedule 20.10.2014    source источник
comment
вы имеете в виду, что вы просто хотите прекратить цикл после того, как нашли строку в своем примере, или вообще не имеете циклов?   -  person CuccoChaser    schedule 20.10.2014
comment
Если вы используете C # 4.0, вот несколько мыслей. stackoverflow.com/questions/1262965/   -  person Francois    schedule 20.10.2014
comment
Я не понимаю, как использовать словарь для записи в файл. Я хочу записать файл в определенную строку, я уже знаю строку, которую хочу отредактировать. С другой стороны, я уже прочитал предложенный вами пост, проблема в том, что этот пост о том, как читать, а не писать.   -  person Restro Fad    schedule 20.10.2014


Ответы (2)


Судя по всему, это невозможно. Вы не можете случайным образом перейти к позиции на основе символов там, поэтому вам нужно читать до тех пор, пока не найдете строку для замены, следовательно, цикл. Единственный способ сделать это без цикла - это если строки будут одинаковой длины, где вы скажете «Мне нужен номер строки x», и вы захотите найти x * [line length]. Это простая, но относительно ограниченная установка.

Тем не менее, если вы хотите заменить только одну строку, вам, вероятно, все равно придется беспокоиться о длине строки. Вы не можете «вставить» в поток, вы можете только выбрать начальную позицию и записать последующие байты. Таким образом, если вы попытаетесь заменить строку длиной 40 символов на строку длиной 60, вы закончите записывать 18 (60 - 40 - "\r\n".Length) символов в следующую строку.

Итак, в основном здесь есть два сценария:

  1. Постоянная длина строки: ищите через поток, который сводит на нет ваш цикл.
  2. Переменная длина строки: вам нужно выполнить цикл, но это нормально, потому что вам все равно придется переписать любые данные, следующие за замененной строкой.

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

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

Если вы действительно отчаянно нуждаетесь в производительности и если файл каким-либо образом отсортирован или проиндексирован, например, вы можете написать простой двоичный поиск, который ищет вокруг файла. Хотя для действительно большого файла это принесет лишь незначительную пользу.

Хотя, если честно. Если вы не имеете дело с «действительно большим файлом», я был бы несколько удивлен, увидев, что на все это уходит столько времени. И если да, возможно, стоит подумать о разработке архитектуры вашего приложения таким образом, чтобы вы могли это учесть. Ввод-вывод по своей сути является дорогостоящим, и поэтому его сложно оптимизировать так, как нам иногда хотелось бы, поэтому вам, вероятно, понадобится индикатор выполнения или эквивалент, чтобы показать вашему пользователю, что что-то происходит.

person Matthew Haugen    schedule 20.10.2014
comment
Спасибо, что нашли время объяснить это. - person Restro Fad; 25.10.2014

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

Подробности см. В следующем обсуждении: Вставка текста в файл по определенному смещению с использованием Win32 API

person George Polevoy    schedule 20.10.2014