Intereting Posts
Каким образом можно легко получить доступ к макросам prebuild, таким как $ (SolutionDir) и $ (DevEnvDir), из кода на C #? API отслеживания изменений структуры Entity Framework и справочные записи Как обеспечить преобразование при использовании Reflection.SetValue? Назначение и семантика интерфейса IMigrationMetadata в Entity Framework linq запрос для возврата различных значений поля из списка объектов Как определить, является ли выбранный узел дочерним или родительским узлом в TreeView? С блочным эквивалентом в C #? Как отобразить pdf-файл в веб-форме asp.net c #, чтобы json не отображал правильно Как измерить время отклика и время загрузки веб-страницы? Обработка FileContentResult, когда файл не найден EntityFramework Число запросов LINQ не выполняется, но запрос возвращает результат. Как оптимизировать запрос LINQ? Вставить текущее время в Visual Studio Snippet Удалите текст после нажатия в текстовом поле Как создать программный телефон (используя протокол SIP) с помощью C #

Замена строки в файле «на месте» – C #

Возможный дубликат:
Редактирование текстового файла через C #

Мне нужно заменить строку в очень большом файле, поэтому я не хочу читатьAll и writeAll – я хочу попасть в строку, требующую замены, замены и закрытия файла. Любая идея, как это сделать на C #?

Спасибо!

На самом деле у вас есть два варианта: у первого есть серьезные ограничения, второй – самый простой и, возможно, тот, который вы хотите.

  1. Откройте файл для чтения чтения, прочитайте файл по строкам, вспомните позицию текущей строки, которую вы только что прочитали (StreamReader.BaseStream.pos). Если это строка, которую нужно заменить, а новая строка будет точно такой же, как и у старой , вернитесь к началу строки и напишите.
  2. Откройте файл, прочитайте каждую строку, напишите в новый файл, не записывайте строку, которую нужно заменить, но вместо этого напишите новую строку. Затем просто продолжайте читать и писать до завершения.

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

Пойдите с опцией 2

PS Из привычки использовать функции ReadAll WriteAll , они не подходят для приложений реального мира. Идиома «читать строку, обрабатывать строку» будет работать с файлами 100k и 100TB одинаково хорошо. , , 100TB-файл, очевидно, займет немного больше 🙂

PPS. В то время как вариант 1 звучит прямо, на самом деле удивительно сложно реализовать правильно, есть 100 мелочей, которые могут пойти не так. Размеры байтов переменных, различные кодировки и т. Д. Вариант 2 так же прост, как кажется.

Короткий ответ: нет.

Будет намного проще и быстрее просто читать из одного файла и писать другому.

Если ваша новая строка имеет такую ​​же длину, как и она, вы можете записать ее в соответствующее место файла. Если он короче, вы можете «взломать» это, расширив его пробелами … Но если его дольше, вы должны переписать файл с этой позиции до конца (начало файла остается прежним). С другой стороны, если часть, которую вы должны заменить, очень велика, это действительно быстрее, чтобы stream заменить файл на другой.