![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Доброго времени суток!
У меня такая проблема:
Мне нужно запаковать в зип арзив один файл, который находится в масиве байт (array of byte) Вначале я устанавливаю указать Tstream на начало массива в котором содержится файл, затем пытаюсь загрузить поток в OutArchive, запаковать, и сохоанить для проверки результата. Но проблема в том что такой вариант пакует только первые 170-180 байт. Если загрузить файл, (OutArchive.AddFile) то всё работает отлично. Помогите запаковать файл из потока, не загружая его с диска Спасибо Добавлено через 10 минут и 33 секунды Попытался загрузить файл в поток Stream.LoadFromFile, но проблема осталась прежней. Вероятно я неправильно пытаюсь передать потоковые данные. Смущает что нигде не требуется указать длину данных. |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Или может быть возможно загрузить пустой файл, а потом записать новый буфер, и указать нвый размер? я не могу найти подходящих методов
|
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Кто работал, прошу помочь.
Моя цель: Имеется массив байт-это файл. Данный файл нужно запаковать в архив. В архиве этот файл должен быть один, с заданым мною именем. Но сам архив должен быть тоже в виде Tstream или простого массива байт. То есть запаковать файл который находится в памяти, и оставить архив в памяти, без сохранения на диск. Приведённый выше код сделал бы это, еслибы получилось агрузить файл не с диска, и из потока. Если кто может помочь, очень прошу. Для решения возможны варианты сторонных dll, ругих модулей или компонентов, но главное условие - работа без сохранения на диск, возможность запаковать один файл с указаным именем в архив. |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
И в чем проблема?
-------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Поменял тип TMemoryStream на TCustomMemoryStream, теперь архив создаётся, записыватся в файл.
А вот при попытке сделать OutArchive.SaveToStream(Stream[id]); получаю ошибку. |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Если создать две разные перемнные, то всё ок. Но я хотел сохранить снова в ту, с которой брал. Чтобы не создавать много копий в памяти.
И ещё момент, компилятор ругается [Warning] Unit1.pas(2161): Constructing instance of 'TMMStream' containing abstract method 'TStream.Write' Это сообщение отредактировал(а) lollollollol - 13.3.2013, 15:47 |
|||
|
||||
| Чучмек |
|
||||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Сопоставь одно с другим. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||
|
|||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Переопредели в TMMStream абстрактный метод Write
Только учти, что если сжатый файл больше несжатого (Position+count>length(m)*sizeOf(m[0]) получишь AV -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| lollollollol |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 287 Регистрация: 12.3.2013 Репутация: нет Всего: нет |
Stream[id] Эт просто у меня массив переменных, array of TMemoryStream
В каких случаях сжатый может быть больше несжатого? Сейчас он стабильно меньше на 15-30% Спасибо за помощь, всё получилось! хотел поставить тебе плюс, но нельзя. Если кто поставит за меня, буду благодарен:) Это сообщение отредактировал(а) lollollollol - 13.3.2013, 19:38 |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
1. Сжимается маленький файл
2. Файл содержит уже сжатую информацию. mp3 например. Добавлено через 3 минуты и 32 секунды Заполни массив случайными числами. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |