Вверх ↑
Этот топик читают: Гость
Ответов: 233
Рейтинг: 12
#16: 2019-03-03 00:26:42 ЛС | профиль | цитата
Netspirit, А возможно сделать на твоем компонете запаковку множества файлов с их начальными именами?
карма: 2

0
Ответов: 4621
Рейтинг: 746
#17: 2019-03-04 11:37:41 ЛС | профиль | цитата
В теории - можно, но компонент предназначен для более элементарных вещей.
Точнее, формат GZIP имеет конкретную спецификацию и предназначен для сжатия одного файла. Поэтому линуксоиды для сжатия множества файлов сначала пакуют их в несжатый контейнер *.tar, затем этот файл подают на gzip, получая *.tar.gz - архив с одним файлом *.tar внутри.

Ты можешь сам попробовать реализовать это стандартными компонентами и работой со Stream в данном компоненте.

Открываешь конечный файл компонентом FileStream (1), с помощью DataToFile пишешь туда имя файла, сохраняешь отдельно текущую позицию в (1), увеличиваешь позицию (пропускаешь) на 4 байта (будущий размер сжатого файла). Потом открываешь вторым FileStream(2) сжимаемый файл и с помощью GZIP сжимаешь его в конечный поток (1). В конце компонент выдаёт размер записанного файла - возвращаешь позицию в потоке (1) на сохраненное раньше значение и пишешь размер.
Закрываешь поток (2), переходишь в конец потока (1) и повторяешь процесс для следующего файла.

Распаковка - открываешь контейнер, читаешь имя файла, читаешь размер, распаковываешь требуемое количество в отдельный файл с оригинальным именем.

Редактировалось 2 раз(а), последний 2019-03-14 14:07:16
карма: 26

0
Ответов: 9906
Рейтинг: 351
#18: 2019-03-05 11:29:16 ЛС | профиль | цитата
Netspirit писал(а):
Открываешь конечный файл компонентом FileStream (1), с помощью DataToFile пишешь туда имя файла, сохраняешь отдельно текущую позицию в (1), увеличиваешь позицию (пропускаешь) на 4 байта (будущий размер сжатого файла). Потом открываешь вторым FileStream(2) сжимаемый файл и с помощью GZIP сжимаешь его в конечный поток (1). В конце компонент выдаёт размер записанного файла - возвращаешь позицию в потоке (1) на сохраненное раньше значение и пишешь размер.
Закрываешь поток (2), переходишь в конец потока (1) и повторяешь процесс для следующего файла

Офигеть
карма: 9

0
Ответов: 4621
Рейтинг: 746
#19: 2019-03-05 11:34:41 ЛС | профиль | цитата
Galkov, никак не могу угадать что бы этот возглас значил...

Редактировалось 1 раз(а), последний 2019-03-05 11:34:59
карма: 26

0
Ответов: 9906
Рейтинг: 351
#20: 2019-03-05 12:34:32 ЛС | профиль | цитата
Сие означает, что: прочитавши три раза, я так и не уверен что все правильно понял.

Хотя, казалось бы, говорится о простой последовательности записей: dtAnsiString — dtPString — dtAnsiString — dtPString ...
Таки - простота признак таланта. Как нас учили когда-то.
карма: 9

0
Ответов: 4621
Рейтинг: 746
#21: 2019-03-05 12:45:48 ЛС | профиль | цитата
А где там расположение сжатых файлов и как узнать их размер для последующей распаковки?
карма: 26

0
Ответов: 9906
Рейтинг: 351
#22: 2019-03-05 13:00:44 ЛС | профиль | цитата
Netspirit, ты прикалываешься что ли ....

Редактировалось 1 раз(а), последний 2019-03-05 13:01:22
карма: 9

0
Ответов: 4621
Рейтинг: 746
#23: 2019-03-05 13:20:49 ЛС | профиль | цитата
Нет.
Сейчас я вспомнил про dtPString c 4-байтным префиксом, но я не поклонник конвертировать большие файлы в строки (тем более, в случае распаковки, когда конечный размер буфера неизвестен - присутствуют дополнительные перевыделения памяти). И да, с упаковкой понятно. А при распаковке - считать dtPString в строку, распаковать, сконвертировать её в Stream, сделать doCopyFromStream? (Потому как наш DataToFile до сих пор не умеет записать в файл строку без всяких префиксов/окончаний).

Редактировалось 8 раз(а), последний 2019-03-05 14:36:03
карма: 26

0
Ответов: 4621
Рейтинг: 746
#24: 2019-03-06 12:56:08 ЛС | профиль | цитата
Обновил компонент:
- исправил ошибки при работе с потоками и файлами
- добавил примеры упаковки и распаковки множества файлов в один


При открытии примеров может предупреждать об отсутствии точки/свойства в FileStream - не обращайте внимания, использовался модифицированный.
Примеры в т.ч. показывают общий пример работы с самодельными файловыми контейнерами. Можно GZIP в примерах заменить на последние обновленные EnCrypt/DeCrypt, или мои компоненты шифрования, имеющие аналогичные методы работы с потоками, и получить контейнер с шифрованными файлами.

Редактировалось 2 раз(а), последний 2019-03-06 12:57:53
карма: 26

0
Ответов: 207
Рейтинг: 14
#25: 2020-11-25 17:01:16 ЛС | профиль | цитата
Netspirit писал(а):
Если кому-то интересно, в архиве модифицированный файл KolZLib.pas для работы стандартного компилятора FPC через официальную zlib.dll

А на новом FPC GZIP не будет работать?

Редактировалось 2 раз(а), последний 2020-11-25 21:08:50
карма: 2

0
Ответов: 4621
Рейтинг: 746
#26: 2020-11-26 12:46:25 ЛС | профиль | цитата
Нужна доработка.
карма: 26

0
26
Сообщение
...
Прикрепленные файлы
(файлы не залиты)