2009-04-07 10 views
3

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

Файл будет XML-файлом. Файл будет содержать (в пределах первых нескольких строк) текстовую строку, которая должна быть удалена или заменена пробелом (неважно, какой из них).

Проблема в том, что файл XML имеет размер в несколько гигабайт, но строка фиксированного поиска и замены будет происходить в течение первых 4 тыс. Или около того.

Каков наилучший способ перезаписать строку поиска и сохранить на месте, не требуя чтения всей суммы в память и слишком много записи на диск?

+0

На самом деле S & R. Есть ли стандартный API для этого? Кажется бессмысленным писать с нуля. – 2009-04-07 11:20:36

+0

LPTSTR StrStr ( LPCTSTR lpFirst, LPCTSTR lpSrch ); Угадайте, я постараюсь это сделать. Не знаком с окнами вообще ... – 2009-04-07 11:24:05

ответ

1

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

Если бы это было для среды Unix, я бы рассмотрел использование mmap(), чтобы отобразить подходящую часть начала файла в ОЗУ, а затем отредактировать его на месте и сделать.

This snippet показывает, как использовать эквивалент Win32, функцию CreateFileMapping().

+0

Спасибо. Я полагаю, что функция CFM() позволяет отображать только частичный файл в ОЗУ и что ОС будет обрабатывать остальные. Я посмотрю. – 2009-04-07 11:12:16

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^