Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вставка данных в 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 файлстрима, копируешь до места вставки, копируешь то, что надо вставить, копируешь то, что ещё не скопировал. При желании повторить.


Наверх

Титульная страница Поиск, карта сайта Написать письмо