Судя по всему, это невозможно. Вы не можете случайным образом перейти к позиции на основе символов там, поэтому вам нужно читать до тех пор, пока не найдете строку для замены, следовательно, цикл. Единственный способ сделать это без цикла - это если строки будут одинаковой длины, где вы скажете «Мне нужен номер строки x», и вы захотите найти x * [line length]
. Это простая, но относительно ограниченная установка.
Тем не менее, если вы хотите заменить только одну строку, вам, вероятно, все равно придется беспокоиться о длине строки. Вы не можете «вставить» в поток, вы можете только выбрать начальную позицию и записать последующие байты. Таким образом, если вы попытаетесь заменить строку длиной 40 символов на строку длиной 60, вы закончите записывать 18 (60 - 40 - "\r\n".Length
) символов в следующую строку.
Итак, в основном здесь есть два сценария:
- Постоянная длина строки: ищите через поток, который сводит на нет ваш цикл.
- Переменная длина строки: вам нужно выполнить цикл, но это нормально, потому что вам все равно придется переписать любые данные, следующие за замененной строкой.
Полагаю, я мог бы также использовать третий сценарий, в котором вам гарантируется, что ваша замещающая строка будет точно такой же длины, как и исходная. Затем вам нужно перейти только к этой строке. Но на самом деле это всего лишь совокупность двух вышеупомянутых.
Очевидно, есть несколько более приятных способов (возможно) выполнить эту функцию. По крайней мере, более простые способы. Но у меня не сложилось впечатления, что вы просите именно об этом.
Если вы действительно отчаянно нуждаетесь в производительности и если файл каким-либо образом отсортирован или проиндексирован, например, вы можете написать простой двоичный поиск, который ищет вокруг файла. Хотя для действительно большого файла это принесет лишь незначительную пользу.
Хотя, если честно. Если вы не имеете дело с «действительно большим файлом», я был бы несколько удивлен, увидев, что на все это уходит столько времени. И если да, возможно, стоит подумать о разработке архитектуры вашего приложения таким образом, чтобы вы могли это учесть. Ввод-вывод по своей сути является дорогостоящим, и поэтому его сложно оптимизировать так, как нам иногда хотелось бы, поэтому вам, вероятно, понадобится индикатор выполнения или эквивалент, чтобы показать вашему пользователю, что что-то происходит.
person
Matthew Haugen
schedule
20.10.2014