Netspirit, А возможно сделать на твоем компонете запаковку множества файлов с их начальными именами?
Этот топик читают: Гость
Ответов: 233
Рейтинг: 12
|
|||
карма: 2 |
|
Ответов: 4654
Рейтинг: 760
|
|||
В теории - можно, но компонент предназначен для более элементарных вещей.
Точнее, формат 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 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Netspirit писал(а): Открываешь конечный файл компонентом FileStream (1), с помощью DataToFile пишешь туда имя файла, сохраняешь отдельно текущую позицию в (1), увеличиваешь позицию (пропускаешь) на 4 байта (будущий размер сжатого файла). Потом открываешь вторым FileStream(2) сжимаемый файл и с помощью GZIP сжимаешь его в конечный поток (1). В конце компонент выдаёт размер записанного файла - возвращаешь позицию в потоке (1) на сохраненное раньше значение и пишешь размер.
Закрываешь поток (2), переходишь в конец потока (1) и повторяешь процесс для следующего файла Офигеть ![]() |
|||
карма: 9 |
|
Ответов: 4654
Рейтинг: 760
|
|||
Galkov, никак не могу угадать что бы этот возглас значил...
Редактировалось 1 раз(а), последний 2019-03-05 11:34:59 |
|||
карма: 26 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Сие означает, что: прочитавши три раза, я так и не уверен что все правильно понял.
Хотя, казалось бы, говорится о простой последовательности записей: dtAnsiString — dtPString — dtAnsiString — dtPString ... Таки - простота признак таланта. Как нас учили когда-то. |
|||
карма: 9 |
|
Ответов: 4654
Рейтинг: 760
|
|||
А где там расположение сжатых файлов и как узнать их размер для последующей распаковки?
|
|||
карма: 26 |
|
Ответов: 9906
Рейтинг: 351
|
|||
Netspirit, ты прикалываешься что ли ....
Редактировалось 1 раз(а), последний 2019-03-05 13:01:22 |
|||
карма: 9 |
|
Ответов: 4654
Рейтинг: 760
|
|||
Нет.
Сейчас я вспомнил про dtPString c 4-байтным префиксом, но я не поклонник конвертировать большие файлы в строки (тем более, в случае распаковки, когда конечный размер буфера неизвестен - присутствуют дополнительные перевыделения памяти). И да, с упаковкой понятно. А при распаковке - считать dtPString в строку, распаковать, сконвертировать её в Stream, сделать doCopyFromStream? (Потому как наш DataToFile до сих пор не умеет записать в файл строку без всяких префиксов/окончаний). Редактировалось 8 раз(а), последний 2019-03-05 14:36:03 |
|||
карма: 26 |
|
Ответов: 4654
Рейтинг: 760
|
|||
Обновил компонент:
- исправил ошибки при работе с потоками и файлами - добавил примеры упаковки и распаковки множества файлов в один При открытии примеров может предупреждать об отсутствии точки/свойства в FileStream - не обращайте внимания, использовался модифицированный. Примеры в т.ч. показывают общий пример работы с самодельными файловыми контейнерами. Можно GZIP в примерах заменить на последние обновленные EnCrypt/DeCrypt, или мои компоненты шифрования, имеющие аналогичные методы работы с потоками, и получить контейнер с шифрованными файлами. Редактировалось 2 раз(а), последний 2019-03-06 12:57:53 |
|||
карма: 26 |
|
Ответов: 207
Рейтинг: 14
|
|||
Netspirit писал(а): Если кому-то интересно, в архиве модифицированный файл KolZLib.pas для работы стандартного компилятора FPC через официальную zlib.dllА на новом FPC GZIP не будет работать? Редактировалось 2 раз(а), последний 2020-11-25 21:08:50 |
|||
карма: 2 |
|
Ответов: 4654
Рейтинг: 760
|
|||
Нужна доработка.
|
|||
карма: 26 |
|
Ответов: 4654
Рейтинг: 760
|
|||
Обновлен компонент - в папке "Unicode version" добавлен вариант для пакета нового FPC.
|
|||
карма: 26 |
| ||
Голосовали: | strannik_nebes |
Ответов: 182
Рейтинг: 4
|
|||
Netspirit, у меня не компилируется. Пример из архива
Редактировалось 3 раз(а), последний 2025-03-24 16:02:54 |
|||
карма: 1 |
|
Ответов: 4654
Рейтинг: 760
|
|||
Старый компилятор. Выбери новые.
|
|||
карма: 26 |
|
29