![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатель на последниий компонент потока [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)
читать потом будет интересно