![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
flankerr |
![]() ![]()
Сообщение
#1
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Есть некий набор данных который создаёт программа. Надо их опяттаки программно сжать в ZIP и сохранить. Разумеется хочется чтоб была возможность следить за процеесом для возможности информировать сколько осталось время до конца сжатия. Всякие вызовы сторонних EXE отметаються сразу. Ну и кросплатформенность ни кто не отменял.
Может кто в курсе как это организовать ? |
|
|
![]() |
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
помоему на прогорге это обширно обсуждалось. Можно Link
Вот чего накопал по этой теме: zlib (та что с Qt) - только методы сжатия данных. Link - не поддерживает подкаталоги Link - нет информации (надо разбиратся) Link - нет информации (надо разбиратся) Могут оказатся полезными: Link Link - какие-то фрагменты кода на C++/Qt, в том числе Link |
|
|
sploid |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 51 Регистрация: 26.2.2008 Из: Москва Пользователь №: 106 Спасибо сказали: 10 раз(а) Репутация: ![]() ![]() ![]() |
у тролей есть zlib как 3rdparty
src/3rdparty/zlib/ Link |
|
|
flankerr |
![]()
Сообщение
#4
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Если как сжать набор байт стало относительно понятно.
Но вот как сделать прогесбар пока не ясно. Вызвать тот же qCompress и тупо ждать неизвестно сколько пока он сжимает как то совсем мимо цели Т.к. процесс сжатия может занять достаточно длительное время то прогрессбар просто обязан быть. Да и что делать для сжать папки с вложенными папками и файлами тоже не ясно. Городить огород с собственным форматом выходного файла нельзя т.к. необходимо чтобы результат сжатия можно было распаковатть классическим ZIP-ом. Сообщение отредактировал flankerr - 9.10.2009, 12:35 |
|
|
kwisp |
![]()
Сообщение
#5
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
flankerr,
что ни одно из предоложенных решений Юрием не предоставляет возможности сжимать вложенные паки? и никак не прикрутишь прогрессБар? |
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(kwisp @ 9.10.2009, 17:53) Link что ни одно из предоложенных решений Юрием не предоставляет возможности сжимать вложенные паки? возможно, ни одно из них не предоставляет обратной связи.и никак не прикрутишь прогрессБар? Собсна это болезнь многих писателей консольных программ/библиотек. |
|
|
flankerr |
![]()
Сообщение
#7
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
kwisp,
QuaZIP Zlib qCompress жмут поток т.е. папку с вложением подсунуть нельзя. И как правильно сказал Litkevich Yuriy, нет обратной связи. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
flankerr, видимо у тебя один выход - заниматся раскопками ОпенСорсных проектов типа Link...
|
|
|
SABROG |
![]()
Сообщение
#9
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Litkevich Yuriy @ 9.10.2009, 17:36) Link flankerr, видимо у тебя один выход - заниматся раскопками ОпенСорсных проектов типа Link... Бессмысленно. Мои копания привели к тому, что разработчики предоставляют библиотеку только для создания 7z архивов, ни zip, ни rar и т.п. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Однако исодники у них открыты, или я ошибаюсь?
|
|
|
SABROG |
![]()
Сообщение
#11
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Litkevich Yuriy @ 9.10.2009, 19:28) Link Однако исодники у них открыты, или я ошибаюсь? Открыты, только тогда придеться брать исходники p7zip (порт под linux). Там вроде бы какраз есть директория zip с исходниками. Думаю там точно такая же канитель будет с пониманием ABI, как и в InfoZip. |
|
|
BRE |
![]()
Сообщение
#12
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Можно посмотреть решение в KDE. Там правда все сделано глобально, т.е. есть целая иерархия классов начиная с KArchive. У него есть наследник KZip.
Или посмотреть на библиотеку libzip. Она сишная, но можно самому написать враппер для C++ со всем необходимым функционалом. Также вроде есть готовый враппер libzipios++. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#13
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
в KDE в большенстве случаев индикатор выполнения болтается туда-сюда.
|
|
|
BRE |
![]()
Сообщение
#14
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Litkevich Yuriy @ 11.10.2009, 13:33) Link в KDE в большенстве случаев индикатор выполнения болтается туда-сюда. Если писать свой враппер, то это можно сделать как надо: * Открыть архив * Найти по имени файла его индекс * Получить информацию о файле по индексу (необходим размер распакованных данных) * В цикле читаем данные файла из архива кусками и посылаем сигнал о прогрессе. Сообщение отредактировал BRE - 11.10.2009, 13:21 |
|
|
kuzulis |
![]()
Сообщение
#15
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: ![]() ![]() ![]() |
А почему автору нельзя использовать сторонние архиваторы?
Проще, ИМХО, через QProcess их вызывать и в опциях командной строки подсовывать нужные каталоги для сжатия... Для этого в самой программе автора определять - какие из архиваторов находятся в системе... НЕ ? ![]() |
|
|
kwisp |
![]()
Сообщение
#16
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
kuzulis,
первый пост об этом говорит. |
|
|
filinGUI |
![]()
Сообщение
#17
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 12.10.2009 Пользователь №: 1152 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
flankerr
Архивирование с вложенными каталогами и отображением прогресса можно сделать, используя Info-ZIP. Архив получается вполне стандартный и распакуется везде. Надо только собрать zip и unzip как dll и написать callback-функцию для отображения прогресса. |
|
|
SABROG |
![]()
Сообщение
#18
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(filinGUI @ 12.10.2009, 15:11) Link flankerr Архивирование с вложенными каталогами и отображением прогресса можно сделать, используя Info-ZIP. Архив получается вполне стандартный и распакуется везде. Надо только собрать zip и unzip как dll и написать callback-функцию для отображения прогресса. Найти бы еще пример как это делать. Мои копания примеров этой утилиты привели только к одному заключению - функций типа createZip()/Unzip() нет. Т.е. нужно делать какие-то подготовительные телодвижения, логика которых не становится понятной глядя на код. |
|
|
filinGUI |
![]()
Сообщение
#19
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 12.10.2009 Пользователь №: 1152 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(SABROG @ 12.10.2009, 15:30) Link Найти бы еще пример как это делать. Мои копания примеров этой утилиты привели только к одному заключению - функций типа createZip()/Unzip() нет. Т.е. нужно делать какие-то подготовительные телодвижения, логика которых не становится понятной глядя на код. Таких простых функций действительно нет, для упаковки используется последовательность вызовов ZpInit / ZpSetOptions / ZpArchive, для распаковки вызывается Wiz_SingleEntryUnzip. Для своего проекта я написал функцию SimpleUnzip (Qt3, библиотека Unzip.dll загружается динамически) Раскрывающийся текст
Могу дать ещё пример SimpleZip для упаковки, но только на Delphi |
|
|
SABROG |
![]()
Сообщение
#20
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Плохо это решение тем, что оно не переносимо, ибо этот Wizard dll API зависим в то время как внутренние вызовы самой библиотеки InfoZip переносимы. Т.е., чтобы понять как это работает и правильно написать код, надо сначала переписать Wizard dll на обычном C++ с использованием STL или обычном Си. Потом уже этот код использовать в Qt.
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 7.8.2025, 14:25 |