Форум: "Начинающим";
Текущий архив: 2011.05.29;
Скачать: [xml.tar.bz2];
ВнизУказатель на последниий компонент потока Найти похожие ветки
← →
Ghost del vonte © (2011-02-17 15:03) [0]Здравствуйте! Тут такое дело, я хочу создать для своей программы что-то вроде архивов (в них будут хранится ресурсы (файлы)), в поток (TFileStream), будут записываться файлы, предварительно сжатые ZLib, синхронно с этим будет в дополнительный поток (TMemoryStream\TWriter) записываться информация об этих файлах (позиция, размер, имена, и имена папок (в которые будут помещены), после записи в поток всех файлов, информационный файл надо сохранить (также сжав его) в самый конец потока TFileStream), проблема в том, что я не могу поставить указатель (при открытии этого "архива" на самый последний файл (информационный), скажите, если в самом начале зарезервировать место для информации о позиции и размере сего файла
P^ := 0000000000;
MS.WriteBuffer(P^, buf, 9);
а потом в самом конце вернутся и внести эту информацию туда, указатели расположения всех файлов не поменяются?
← →
Игорь Шевченко © (2011-02-17 15:27) [1]
> после записи в поток всех файлов, информационный файл надо
> сохранить (также сжав его) в самый конец потока TFileStream)
читать потом будет интересно
← →
Slym © (2011-02-17 20:41) [2]Ghost del vonte © (17.02.11 15:03)
расположения всех файлов не поменяются
нет...
зачем 9 байт? восьми байт Int64 вполне хватит :)
← →
Slym © (2011-02-17 20:44) [3]Игорь Шевченко © (17.02.11 15:27) [1]
вполне нормально:
заголовок фикс размера с указанием смещения на таблицу фс, далее файлы, и в конце таблица фс...
таблицу фс можно куда угодно вставить, информация о смещении в заголовке укажет правитьный путь
← →
RWolf © (2011-02-17 23:42) [4]
> Ghost del vonte © (17.02.11 15:03)
смещения блоков данных в потоке не поменяются, WriteBuffer после Seek в начало потока просто затирает ранее записанное.
← →
Rouse_ © (2011-02-17 23:58) [5]
> Игорь Шевченко © (17.02.11 15:27) [1]
> читать потом будет интересно
ZIP вообще-то так и формируется, CentralDirectory у него в конце :)
← →
Rouse_ © (2011-02-18 00:08) [6]Да кстати, Ghost del vonte © - судя по описанию ты реально пытаешся воспроизвести формат ZIP файла. Рекомендую не заморачиваться а открыть его спецификацию и реализовать все по ней. Там и данные по элементам в виде LocalHeader с дополнительным финализирующим дескриптором и расширенные стримы дополняющие блок данных, и т.н. "информационный файл" с виде нескольких структур помещаемых как раз в конец файла. Их можно так-же сжимать и шифровать.
← →
Ghost del vonte © (2011-02-18 00:14) [7]Спасибо всем, эту проблему я решил! Но появилась другая: если файлов ооочень много, длина позиций увеличивается, и тип Integer не выдерживает, поэтому использую LongWord, все бы ничего но! TWriter не поддерживает этот тип, там нет такого: WR.WriteLongWord.....
← →
clickmaker © (2011-02-18 00:22) [8]> TWriter не поддерживает этот тип, там нет такого: WR.WriteLongWord
procedure WriteInteger(Value: Int64); overload;
← →
sniknik © (2011-02-18 08:05) [9]> и тип Integer не выдерживает
интежером можно адресоваться ровно до 2х гигобайт, 2 гигабайта это ровно столько сколько выдается 32-битной программе/максимальный размер строки/массива/т.д. всего что в памяти (не на диске), и после чего "данных нет"/пришли на край, а у тебя -
> синхронно с этим будет в дополнительный поток (TMemoryStream
подозреваю, что не "Integer не выдерживает@, а что то другое. т.е. проблема решена с проблемой...
← →
Ghost del vonte © (2011-02-18 21:00) [10]
> 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 < мг) то все нормально....
← →
Ghost del vonte © (2011-02-18 21:10) [11]
> в обработчике закрытия написано LView1.Items.Clear;
Забыл добавить, в листвьювере отображены все эти 7000 строк (имен файлов), и при очищении появляется именно эта ошибка...
← →
sniknik © (2011-02-18 21:37) [12]> Превышает числовой диапазон,
Range check error.
> http://content.foto.mail.ru/mail/ghostdelvonte/173/s-425.png
не верная операция над указателем
разные вещи вообще то.
> Не знаю где копать,
баги ищи. у себя в коде.
← →
KilkennyCat © (2011-02-18 23:34) [13]
> Rouse_ © (17.02.11 23:58) [5]
> ZIP вообще-то так и формируется, CentralDirectory у него
> в конце :)
так автор ща похоже просто создаст очередной велосипед архиваторной породы.
по крайней мере, я не увидел в теме ничего, что не делает winrar, например.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.05.29;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c