Название: QZipReader или как распаковать zip Отправлено: 0xFF от Март 01, 2011, 15:08 Доброго времени суток
Проблема в следующем: нужно распаковать файл MS Office (.docx) Версия Qt 4.7.0 Из стандартного для этого нашел QZipReader, но что-то он вообще не хотит работать: Код Пробывал писать вместо extr путь к папке. Такой код показывает файлы в архиве: Код видимо они все же должны как-то извлекаться, раз он их видит. Пробывал с обычными архивами - та же песня, файлы показывает, но ничего не извлекает =( Что я делаю не так? Может кто-нибудь выложит рабочий проектик где этот QZipReader будет работать, он ведь не документирован, информация кусочна, может я что-либо не так подключил. Название: Re: QZipReader или как распаковать zip Отправлено: victor_yacovlev от Март 01, 2011, 19:53 Попробуйте QaZip (http://quazip.sourceforge.net/ (http://quazip.sourceforge.net/)). Документация вполне полная, работоспособность проверена.
Название: Re: QZipReader или как распаковать zip Отправлено: 0xFF от Март 01, 2011, 23:17 Спасибо
Библиотеку эту собрал, вроде работает, но вопрос остался открытым, все же хотел бы разузнать нерабочесть данного класса в моих руках) Название: Re: QZipReader или как распаковать zip Отправлено: voral от Март 02, 2011, 01:47 Странно. Только сегодня фокал под свои нужды это дело все работает (с docx не побовал) вот прямо рабочий код
Код: #include <qvzip.h> qvzip.h - это Qtшный qzip.cpp QVZipReader - это Qtшный QZipReader в данном случае я только переименовал. Это все работает. Хотя одно но я qzip.cpp qzipwriter.h qzipreader.h взял из сырцов qutim (просто под руку попались) - но, думаю, они там Qt-шные. Кстати, там (в этих файлах) все понятно, так что навставляете туда qDebug`ов или дебагером пройдитесь. ЗЫ Не знаю кто там пермишены открутил (может qutim-овцы постарались, а может Qt шники не доделали). Но там это недолго поправить. У меня теперь линуксовые права храняться и восстанавливаются. ЗЗЫ В винде тоже работало Если поможет - присылайте какой либо файл в формате docx - попробую... Название: Re: QZipReader или как распаковать zip Отправлено: 0xFF от Март 02, 2011, 10:57 Подключил попавшиеся вам под руку файлы из qutim. Результат оказался тот же, я поковырялся в qzip.cpp, вообщем незнаю правильно это или нет, но все файлы в архиве определяются как Symlink.
Я закомментил в функции extractAll следующее: Код и о чудо, файлы разархивировались, но опять трабл, разархивируются только файлы в корне архива, т.е. архивированные папки идут лесом. Такое ощущение что проблемы в ОС (Win7), еще попилю код, надеюсь все же вытащу папки) Название: Re: QZipReader или как распаковать zip Отправлено: voral от Март 02, 2011, 13:36 Подключил попавшиеся вам под руку файлы из qutim. Результат оказался тот же, я поковырялся в qzip.cpp, вообщем незнаю правильно это или нет, но все файлы в архиве определяются как Symlink. Видимо я наврал (память подвела). Под линем не разархивируется сходу. И "обычный" zip архив тоже. Возможно есть отличия по формату со стандартным zip. (http://en.wikipedia.org/wiki/ZIP_%28file_format%29) можно сравнить с кодом.и о чудо, файлы разархивировались, но опять трабл, разархивируются только файлы в корне архива, т.е. архивированные папки идут лесом. Такое ощущение что проблемы в ОС (Win7), еще попилю код, надеюсь все же вытащу папки) Возможно docx так же имеет дополнительные поля которые не умеет этот класс обрабатывать. (судя по "внешнему виду" кода он писался на коленке и "лишь бы работало то что нужно в конкретной задаче"). Кстати, в qzip.cpp есть следующее: Код: #if defined(Q_OS_WIN) Название: Re: QZipReader или как распаковать zip Отправлено: crackedmind от Март 02, 2011, 14:03 Похоже все проблемы вот в этой функции
Код Т.к. не срабатывает правильно проверка на fi.isFile Цитировать Может эта байда "пееопределяет" значения для стандартного зипа? Эта вся беда вообще из линуксов =)Название: Re: QZipReader или как распаковать zip Отправлено: voral от Март 02, 2011, 14:27 Цитировать Может эта байда "пееопределяет" значения для стандартного зипа? Эта вся беда вообще из линуксов =)Цитировать In file included from ..\src\main.cpp:6: правда не на все..\src\/qvzip.h:59:1: warning: "S_ISDIR" redefined In file included from ..\..\..\Qt\2010.05\qt\mkspecs\win32-g++/qplatformdefs.h:61, Название: Re: QZipReader или как распаковать zip Отправлено: 0xFF от Март 02, 2011, 14:57 Не глядя глубоко, это дело чинится парсингом строки с файлом из архива, строка содержит название директорий, где должен лежать файл, по этим названиям восстанавливаем иерархию и распихиваем файлы, пока обойдусь QuaZIP, но думаю вернусь к доделке этого распихивания)
Название: Re: QZipReader или как распаковать zip Отправлено: NortT от Июнь 26, 2011, 07:40 Ну что? У получилось у тебя что-нибудь? Я сейчас столкнулся как раз с этой же проблемой :) Дай знать, если получилось. Вообще сейчас у меня в проекте используется OSDABZip, но там нет такой фичи, как QByteArray QZipReader::fileData(const QString &fileName) const, по крайней мере я не нашел.
Название: Re: QZipReader или как распаковать zip Отправлено: ритт от Июнь 26, 2011, 10:18 дело в том, что QZipReader понимает только пермижены в схеме Unix, тогда как в данном .docx используется схема пермиженов FAT (а ещё все даты 01.01.1980)
могу добавить поддержку схемы FAT/VFAT/NTFS/HPFS в QZipReader 4.8, если создадите таску на http://bugreports.qt.nokia.com/ з.ы. quazip - отстой Название: Re: QZipReader или как распаковать zip Отправлено: NortT от Июнь 26, 2011, 11:35 2Константин: я пытаюсь распаковать обычный зип, зипованый линуксовым зипом.
Название: Re: QZipReader или как распаковать zip Отправлено: ритт от Июнь 26, 2011, 11:41 у меня работает отлично. правда, я внёс ряд изменений в свою версию...
давайте компилябельный пример с тестовым архивом. Название: Re: QZipReader или как распаковать zip Отправлено: NortT от Июнь 26, 2011, 12:27 Вот. Список файлов в архиве выводит в дебаг, файлы из архива не вытаскиваются.
Код: $ dpkg -s zip | grep -i version Название: Re: QZipReader или как распаковать zip Отправлено: ритт от Июнь 26, 2011, 15:12 сначала у меня ругалось на экстра-блоки и я было решил, что дело в них, но оказалось, что я просто сломал у себя парсер экстра-блоков...потом ещё вспомнил, что QZipReader экстра-блоки вообще игнорирует - т.е. дело точно не в них.
заменил в примере qDebug()<<list.at(i).filePath; на qDebug()<<list.at(i).filePath << list.at(i).isDir << list.at(i).isFile << list.at(i).isSymLink << list.at(i).size; и сразу стало ясно - читайте http://www.prog.org.ru/index.php?topic=16992.msg125304#msg125304 Название: Re: QZipReader или как распаковать zip Отправлено: NortT от Июнь 26, 2011, 15:51 Гм.. Сделал архив qzipом. Результат:
Код: "test/" 1 0 0 0 Название: Re: QZipReader или как распаковать zip Отправлено: NortT от Июнь 26, 2011, 17:02 В общем подправил немного под свои нужды. В конструкторе class GZipWriterPrivate : public QZipPrivate исправил:
Код на Код это позволило сохранять нужные(?) права на каталог. И еще при тестировании под виндой нашел один баг(?) с сепаратором в QZipWriter::addDirectory: Код Так у меня не работает. В создаваемом каталоге появляется файл нулевой длины. Под виндой такой архив распаковывается нормально. Под линем при распаковке к каталогу добавляется виндовый "\". Вместо QDir::separator() сделал просто "/". Название: Re: QZipReader или как распаковать zip Отправлено: ритт от Июнь 26, 2011, 17:13 действительно, нужно
Код: name = QDir::fromNativeSeparators(name); > permissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner) так неправильно. нужно так: Код: #ifndef FILE_ATTRIBUTE_READONLY Название: Re: QZipReader или как распаковать zip Отправлено: ритт от Июнь 26, 2011, 17:15 кстати, из
struct Q_GUI_EXPORT FileInfo нужно убрать Q_GUI_EXPORT (у Вас может быть другой другой макрос - не суть, его нужно убрать) Название: Re: QZipReader или как распаковать zip Отправлено: NortT от Июнь 26, 2011, 18:06 Так у меня не работает. Если распаковывать архив с правильными пермишинами, то создается только структура каталогов, файлы не извлекаются. Если попытаться запаковать, то пермишины становятся неправильными (у каталогов и файлов только rw, а х нету).
Название: Re: QZipReader или как распаковать zip Отправлено: ритт от Июнь 26, 2011, 18:29 код выше относится только к чтению - к упаковке отношения не имеет.
а что вывод `qDebug()<<list.at(i).filePath << list.at(i).isDir << list.at(i).isFile << list.at(i).isSymLink << list.at(i).size;` кажет? Название: Re: QZipReader или как распаковать zip Отправлено: NortT от Июнь 26, 2011, 19:02 код выше относится только к чтению - к упаковке отношения не имеет. Я не про Ваш код, а про свою правку конструктора:а что вывод `qDebug()<<list.at(i).filePath << list.at(i).isDir << list.at(i).isFile << list.at(i).isSymLink << list.at(i).size;` кажет? > permissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ExeOwner) Если из конструктора убрать QFile::ExeOwner, то запаковывается неправильно соответственно распаковать нельзя. так неправильно. нужно так: ... Если распаковываю правильный архив то получаю: Код: "tests/" 1 1 0 0 Код: $ ls -R ~/Desktop/t/ Название: Re: QZipReader или как распаковать zip Отправлено: NortT от Июнь 27, 2011, 12:31 В общем взял QZip из исходников Qt 4.7.3. Все заработало. До этого были исходники из odf-редактора с qt-apps.org, просто сразу я не подозревал, что это есть в исходниках Qt. Я думал это велосипед odf-редактора и пытался прикрутить его к своему проекту, убив два дня на это :)
P.S. 2Константин, спасибо за помощь. Название: Re: QZipReader или как распаковать zip Отправлено: ритт от Июнь 27, 2011, 13:20 пожалуйста. а код из поста http://www.prog.org.ru/index.php?topic=16992.msg125330#msg125330 всё же советую прикрутить...
Название: Re: QZipReader или как распаковать zip Отправлено: NortT от Июль 03, 2011, 10:20 При сборке проекта под виндой возникли проблемы:
Цитировать c:\QtSDK\Desktop\Qt\4.7.3\mingw\lib/libQtGui4.a(d000607.o):(.text+0x0): multiple definition of `QZipReader::QZipReader(QString const&, QFlags<QIODevice::OpenModeFlag>)' Под линем собирается без ошибок. Что нужно сделать?./release\qzip.o:qzip.cpp:(.text+0x788): first defined here Название: Re: QZipReader или как распаковать zip Отправлено: NortT от Июль 03, 2011, 13:22 А все придумал, заюзал namespace.
Название: Re: QZipReader или как распаковать zip Отправлено: ритт от Май 16, 2012, 11:05 патч, упоминавшийся ранее, залит в 5.0. чуть позже ещё залью.
поддержку экстра-блоков пока отложу до лучших времён... |