![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вставка данных в TFileStream [D7, Win2k, WinXP]
Gosha11 © (2006-10-13 09:25:00)Здравствуйте уважаемые.
Если возможность как-нибудь вставить данные в TFileStream не затирая имеющиеся? Я нашел только возможность записывать в него поверх тех данных, что в нем уже есть, с помощью Write, WriteBuffer. А вот вставка со сдвигом данных этого нет. Есть ли какие-нибудь пути решения такой проблемы? Файлы у меня огромные и их в память совсем не хочется грузить, но данные надо вставлять не в конец, а в разные части файлов.
Slym (2006-10-13 10:32:00) [1]а уж потом можно добавить условие: при дозаписи N байт объем записываемых на диск данных не должен привышать N+M байт где M объем спец данных (формата данных) размером которого при больших N можно принебречь
Slym (2006-10-13 10:28:00) [2]Zeqfreed © (13.10.06 10:08) [10]
Только смысла в таком файле не много
В файле не смысл, а данные :)
попробуй дописать в середину 1Gb файла 100Mb информации твоим [1]методом при условии что свободного места 500Mb :)
Zeqfreed (2006-10-13 10:08:00) [3]> [9] Slym © (13.10.06 10:04)
Да это все понятно. Только смысла, мне кажется, в таком файле не много.
Slym (2006-10-13 10:04:00) [4]Zeqfreed © (13.10.06 10:02) [8]
извращенный способ хранения файлов
формат файла со случайным доступом к месту дозаписи
Zeqfreed (2006-10-13 10:02:00) [5]> [6] Slym © (13.10.06 09:59)
Я вообще ни про какие не говорил. Но уверен, что автору не нужен собственный извращенный способ хранения файлов.
Slym (2006-10-13 10:01:00) [6]Zeqfreed © (13.10.06 9:55) [4]
ужасные извращения
это примитивный FAT а не извращения, или даже NTFS (FAT фиксированного размера)
Slym (2006-10-13 09:59:00) [7]Zeqfreed © (13.10.06 9:55) [4]
текстового файла
а ты про текстовый файл до этого ничего не говорил :)
Slym (2006-10-13 09:58:00) [8]чтение:
read(buf,offset,count)
1. суммируем длинны (Length) частей с первой до достижения offset
т.е. определяем в какой части находится искомая инфа.
2. вычисляем смещение в файле согласно проссумированным длиннам, offset и EntryPoint части
3. читаем, если достигли конца части берем следующую часть и продолжаем читать
Zeqfreed (2006-10-13 09:55:00) [9]> [2] Slym © (13.10.06 09:50)
А если надо вставить что-то в середину текстового файла? Или файла определенного формата? Зачем такие ужасные извращения.
Slym (2006-10-13 09:52:00) [10]PiecesTable полностью читаем в память
новые данные пишем по смещению PTEP и при закрытии файла сохранять в конец PiecesTable
Slym (2006-10-13 09:50:00) [11]Можно, Структура файла:
PTEP:Int64 - PiecesTableEntryPoint
Data - Данные;
в конце файла -
PT:array of TPiece; - PiecesTable
TPiece=record
EntryPoint:Int64;
Length:integer;
end;
для вставки: находишь кусок в который надо вставить, разбиваешь его на 2 по месту вставки и между ними создаешь еще один кусок (TPiece), данные дописываешь в конец Data
Иногда нуна делать дефрагментацию файла иначе PiecesTable распухнет
Zeqfreed (2006-10-13 09:30:00) [12]Создаешь 2 файлстрима, копируешь до места вставки, копируешь то, что надо вставить, копируешь то, что ещё не скопировал. При желании повторить.