Вставка текста в файл с определенным смещением с помощью Win32 API - PullRequest
1 голос
/ 01 января 2011

Я ищу способ скорого изменения больших файлов размером в несколько гигабайт.Поддерживает ли Win32 API возможность вставки текста в файл с определенным смещением, без необходимости перезаписывать весь файл обратно на диск с самого начала или со смещением изменения?

Рассмотрим пример.Допустим, у нас есть текст «тест», повторяемый снова и снова в файле размером 1 ГБ.Если я хочу перейти к смещению 500 МБ и вставить текст «новый», есть ли способ вставить его без необходимости перезаписывать весь файл с самого начала и / или без необходимости перезаписывать последние 500 МБ?

Можно ли это сделать с помощью Win32 API?Если нет, существуют ли какие-либо стратегии для оптимизации операции вставки текста, подобной этой, чтобы максимизировать скорость?

Ответы [ 3 ]

9 голосов
/ 01 января 2011

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

Это сводится к тому, как файлы хранятся на диске - обычно порциями, так что эта операция либо невозможна, либо не проста.В 99% случаев это не имеет значения, поэтому API не предоставляет способ сделать это.

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

1 голос
/ 01 января 2011

Вы не можете сделать это.Что вы можете сделать эффективно, это добавить в файл.Вам нужно встроить некоторую структуру в формат файла, если вы хотите воспользоваться этим, как описала Танатос.

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

1 голос
/ 01 января 2011

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

Однако, чтобы сделать вашу жизнь проще, когда у вас есть 64-битная система (в 32-битной системе это не сработает в вашем конкретном сценарии) имеет смысл использовать отображенный в память файл. С файловым API вам нужно скопировать хвост хитрым способом. С MMF вы делаете следующее: 1. Создайте сопоставление файлов и сопоставьте файл с памятью. 2. Переместите хвост дальше, перемещая блок памяти, используя memmove или аналогичную функцию, которая заботится о перекрывающихся блоках. 3. поставьте свои байты посередине.

При таком подходе менеджер памяти сделает большую часть работы за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...