Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.29;
Скачать: CL | DM;

Вниз

Указатель на последниий компонент потока   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.008 c
10-1174567553
Indigoo
2007-03-22 15:45
2011.05.29
"Range check error" в ActiveX


2-1297931315
Den
2011-02-17 11:28
2011.05.29
Поиск контрола на чужой форме


1-1255882069
aha
2009-10-18 20:07
2011.05.29
Получаю данные ( неполный IEEE формат - 3 байта) , как проще


15-1297355437
bss
2011-02-10 19:30
2011.05.29
Управление и слежением за Word / Excel и другими редакторами


2-1297926800
marales
2011-02-17 10:13
2011.05.29
проект при запуске показывает ошибку