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

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

Указатель на последниий компонент потока [D5]


Ghost del vonte ©   (2011-02-17 15:03:00) 

Здравствуйте! Тут такое дело, я хочу создать для своей программы что-то вроде архивов (в них будут хранится ресурсы (файлы)), в поток (TFileStream), будут записываться файлы, предварительно сжатые ZLib, синхронно с этим будет в дополнительный поток (TMemoryStream\TWriter) записываться информация об этих файлах (позиция, размер, имена, и имена папок (в которые будут помещены), после записи в поток всех файлов, информационный файл надо сохранить (также сжав его) в самый конец потока TFileStream), проблема в том, что я не могу поставить указатель (при открытии этого "архива" на самый последний файл (информационный), скажите, если в самом начале зарезервировать место для информации о позиции и размере сего файла

P^ := 0000000000;
MS.WriteBuffer(P^, buf, 9);

а потом в самом конце вернутся и внести эту информацию туда, указатели расположения всех файлов не поменяются?


KilkennyCat   (2011-02-18 23:34:00) [1]


> Rouse_ ©   (17.02.11 23:58) [5]

> ZIP вообще-то так и формируется, CentralDirectory у него
> в конце :)

так автор ща похоже просто создаст очередной велосипед архиваторной породы.
по крайней  мере, я не увидел в теме ничего, что не делает winrar, например.


sniknik   (2011-02-18 21:37:00) [2]

> Превышает числовой диапазон,
Range check error.

> http://content.foto.mail.ru/mail/ghostdelvonte/173/s-425.png
не верная операция над указателем

разные вещи вообще то.

> Не знаю где копать,
баги ищи. у себя в коде.


Ghost del vonte   (2011-02-18 21:10:00) [3]


> в обработчике закрытия написано LView1.Items.Clear;


Забыл добавить, в листвьювере отображены все эти 7000 строк (имен файлов), и при очищении появляется именно эта ошибка...


Ghost del vonte   (2011-02-18 21:00:00) [4]


> sniknik ©   (18.02.11 08:05) [9]


Превышает числовой диапазон, типа, Байту нельзя же присвоить значение больше 255...

Скажите, а что означает эта ошибка? http://content.foto.mail.ru/mail/ghostdelvonte/173/s-425.png

Если в архив добавлено (тестирую его пока) более 7000 рисунков (примерно 700 с чем-то мегабайт), то после распаковки (после!!!) появляется ошибка, а эта ошибка (ссылка выше) появляется при закрытии программы, в обработчике закрытия написано LView1.Items.Clear; Не знаю где копать, если размер архива маленький (50 < мг) то все нормально....


sniknik   (2011-02-18 08:05:00) [5]

> и тип Integer не выдерживает
интежером можно адресоваться ровно до 2х гигобайт, 2 гигабайта это ровно столько сколько выдается 32-битной программе/максимальный размер строки/массива/т.д. всего что в памяти (не на диске), и после чего "данных нет"/пришли на край, а у тебя -
> синхронно с этим будет в дополнительный поток ( TMemoryStream

подозреваю, что не "Integer не выдерживает@, а что то другое. т.е. проблема решена с проблемой...


clickmaker   (2011-02-18 00:22:00) [6]

> TWriter не поддерживает этот тип, там нет такого: WR.WriteLongWord

procedure WriteInteger(Value: Int64); overload;


Ghost del vonte   (2011-02-18 00:14:00) [7]

Спасибо всем, эту проблему я решил! Но появилась другая: если файлов ооочень много, длина позиций увеличивается, и тип Integer не выдерживает, поэтому использую LongWord, все бы ничего но! TWriter не поддерживает этот тип, там нет такого: WR.WriteLongWord.....


Rouse_   (2011-02-18 00:08:00) [8]

Да кстати, Ghost del vonte © - судя по описанию ты реально пытаешся воспроизвести формат ZIP файла. Рекомендую не заморачиваться а открыть его спецификацию и реализовать все по ней. Там и данные по элементам в виде LocalHeader с дополнительным финализирующим дескриптором и расширенные стримы дополняющие блок данных, и т.н. "информационный файл" с виде нескольких структур помещаемых как раз в конец файла. Их можно так-же сжимать и шифровать.


Rouse_   (2011-02-17 23:58:00) [9]


> Игорь Шевченко ©   (17.02.11 15:27) [1]
> читать потом будет интересно

ZIP вообще-то так и формируется, CentralDirectory у него в конце :)


RWolf   (2011-02-17 23:42:00) [10]


> Ghost del vonte ©   (17.02.11 15:03) 

смещения блоков данных в потоке не поменяются, WriteBuffer после Seek в начало потока просто затирает ранее записанное.


Slym   (2011-02-17 20:44:00) [11]

Игорь Шевченко ©   (17.02.11 15:27) [1]
вполне нормально:
заголовок фикс размера с указанием смещения на таблицу фс, далее файлы, и в конце таблица фс...

таблицу фс можно куда угодно вставить, информация о смещении в заголовке укажет правитьный путь


Slym   (2011-02-17 20:41:00) [12]

Ghost del vonte ©   (17.02.11 15:03)
расположения всех файлов не поменяются

нет...
зачем 9 байт? восьми байт Int64 вполне хватит :)


Игорь Шевченко   (2011-02-17 15:27:00) [13]


> после записи в поток всех файлов, информационный файл надо
> сохранить (также сжав его) в самый конец потока TFileStream)


читать потом будет интересно


Наверх

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