Я использую следующий код для вставки текста в произвольный раздел файла:
Dim prebuffer() As Byte
Dim postbuffer() As Byte
Dim number As Integer
number = FreeFile
Open file For Binary Access Read Write Lock Read Write As number
ReDim prebuffer(after - 2)
ReDim postbuffer(LOF(number) - before)
Get number, 1, prebuffer
Get number, before, postbuffer
Seek number, 1
Put number, , prebuffer
Put number, , value
Put number, , postbuffer
Close number
after
и before
- это длинные значения, полученные из предыдущих вызовов на Seek(number)
. Когда after
равно before
, я просто хочу вставить данные, не стирая их. Но когда after
меньше before
, я перезаписываю существующие данные некоторыми своими.
Это прекрасно работает, когда (before - after) <= Len(value)
, поскольку Windows знает, как увеличить размер моего файла для размещения новых байтов. Однако, когда я вставляю меньше байтов, чем удаляю, файл не сжимается и оставляет там существующие байты.
Например, если мой двоичный файл - abcdefghijklmnopqrstuvwxyz
и я хочу вставить HELLO
с after=5
и before=15
, я получу abcdeHELLOopqrstuvwxyzvwxyz
с повторением vwxyz
. Как мне сжать файл, чтобы я получил только abcdeHELLOopqrstuvwxyz
?
Пояснение: я знаю, что могу удалить исходный файл и записать весь буфер обратно, но я стремлюсь к высокой производительности и написал вставку таким образом, потому что чтение и запись всего файла построчно было слишком медленный. Кроме того, я хотел бы сохранить свойства файла в такте и не хочу уничтожать их каждый раз, когда я вставляю запись, создавая совершенно новый файл.