Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Работа с zip архивами в Qt

Автор: igor_bogomolov 13.1.2011, 17:40

Написал небольшую заметку в wiki по работе с zip архивами в Qt.

Цитата
В Qt есть не документированные классы для работы с zip архивами. Эти классы позволяют распаковывать уже существующие архивы по заданному пути, так и создавать новые архивы. Для создания используется класс QZipWriter, для распаковки QZipReader. Реализация этих классов находятся по следующему пути qt/src/gui/text в файлах qzipreader_p.h, qzipwriter_p.h и qzip.cpp.


Продолжение http://www.wiki.crossplatform.ru/index.php/%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_zip_%D0%B0%D1%80%D1%85%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8_%D0%B2_Qt...

Автор: Алексей1153 13.1.2011, 20:06

круто ) Одним головняком меньше, если что))

Автор: ufna 13.1.2011, 22:57

А они разве есть в Qt 4.7 ? Давно сий финт юзаю, помнится даже в 4.6.х какой-то уже не было.

Автор: Алексей1153 13.1.2011, 23:07

ufna, я глянул щас - есть. У меня Qt 4.7.0

Автор: ufna 13.1.2011, 23:31

Видимо в какой-то из промежуточных косяк был, я из-за этого отказался от использования.

Автор: igor_bogomolov 14.1.2011, 8:40

Цитата(ufna @ 13.1.2011, 22:57) *
А они разве есть в Qt 4.7 ? Давно сий финт юзаю, помнится даже в 4.6.х какой-то уже не было.
Эти классы появились с версии Qt4.5. Используются для поддержки ODF формата, Так что пропасть эти классы не могли и не могут :)
Тем более я предлагаю не подключать эти файлы как есть (под Linux это и не получится), а заимствовать их в свой проект.

Автор: Rocky 19.1.2011, 9:27

А как нужно правильно заинклудить хидеры qzipreader_p.h и qzipwriter_p.h?

Если писать так

#include qzipreader_p.h
#include qzipwriter_p.h

то QtCreator их не видит... А вот так:
#include "/home/evgeny/qtsdk-2010.05/qt/include/QtGui/private/qzipreader_p.h"
#include "/home/evgeny/qtsdk-2010.05/qt/include/QtGui/private/qzipwriter_p.h"

недолговечно...

------------
UPD
Все, понятно. Включать их вообще безсмысленно (таким образом).

------------
UPD

Включил 3 zip-файла в проект, но gcc ругается что не может найти zlib. Сам файл находится тут. qt/src/3rdparty/zlib. cmake я не использую. В проекте пытаюсь указать директорий включения так:
INCLUDEPATH += . \
......
$${QTDIR}/src/3rdparty/zlib

QTDIR в переменных среды сборки в Qt Creator указана как /home/evgeny/qtsdk-2010.05/qt. Результат - все равно не видит zlib.h. А если задать полный путь, то все ок. Как это можно побороть? Т.е. я так понимаю QTDIR не разворачивается чтоли?(

Автор: Litkevich Yuriy 19.1.2011, 10:53

Цитата(Rocky @ 19.1.2011, 11:27) *
Если писать так
а как ты свои заголовочники подключаешь?

Автор: Rocky 19.1.2011, 10:58

Чисто свои по относительному пути:

#include "./MainWindow.h"
#include "./ErrorEnum.h"


Qt
#include <QDate>
#include <QFile>
#include <QLibrary>
#include <QDebug>


А эти, zip, я создал директорий Zip, добавил туда 3 файла, qzipreader_p.h, qzipwriter_p.h, qzip.cpp и подключаю так:
#include "../Zip/qzipreader_p.h"
#include "../Zip/qzipwriter_p.h"

Автор: igor_bogomolov 19.1.2011, 11:15

Rocky, попробуй так

INCLUDEPATH += $$[QT_INSTALL_PREFIX]/src/3rdparty/zlib

Автор: Rocky 19.1.2011, 11:37

Да, спасибо, помогло ))

Автор: Winand 19.2.2012, 13:43

В qt 4.8 qzip.cpp:420

const quint32 mode = (qFromLittleEndian<quint32>(&header.h.external_file_attributes[0]) >> 16) & 0xFFFF;

mode получается равен нулю, хотя external_file_attributes[0]=32 для файлов, 16 для директорий. В итоге файлы не определяются файлами и не распаковываются. Дальше я пока не разобрался

Автор: Алексей1153 19.2.2012, 18:34

Winand, 3210==1000002 , поэтому неудивительно, что при сдвиге этого числа на 16 битов вправо получается 0

но дело вообще не в этом. А вот в этом:

const quint32 mode = (qFromLittleEndian<quint32>(&header.h.external_file_attributes[0]) >> 16) & 0xFFFF;

зачем берётся адрес

Автор: Ov3r1oad 29.2.2012, 13:17

Вот использую кусок кода в точности такой же как в статье, но почему в архиве создаются (помимо самих файлов и папок) файлы размером 0 bytes с именем папок. Никто не знает, в чем причина?

Автор: Бублик 20.11.2012, 15:14

А ни у кого не было проблемы при использования QZipReader?

./debug\XXXX.o:C:\projects\XXXX.cpp:410: undefined reference to `_imp___ZN10QZipReaderC1EP9QIODevice'
./debug\XXXX.o:C:\projects\XXXX.cpp:411: undefined reference to `_imp___ZNK10QZipReader8fileDataERK7QString'
./debug\XXXX.o:C:\projects\XXXX.cpp:424: undefined reference to `_imp___ZN10QZipReaderD1Ev'
./debug\XXXX.o:C:\projects\XXXX.cpp:424: undefined reference to `_imp___ZN10QZipReaderD1Ev'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\Exchange.exe] Error 1
mingw32-make: *** [debug] Error 2
15:55:20: The process "C:\projects\qtsdk\mingw\bin\mingw32-make.exe" exited with code 2.


В чем может быть беда?

Автор: Алексей1153 20.11.2012, 17:30

файлы в проект не подключены

Автор: Бублик 20.11.2012, 17:42

Цитата(Алексей1153 @ 20.11.2012, 17:30) *
файлы в проект не подключены


Подключены.

Автор: Алексей1153 21.11.2012, 7:59

поищи в тырнете по строке ": undefined reference to `_imp___ZN10QZipReaderC1EP9QIODevice'"

к примеру, тут вот советуют

http://www.qtforum.org/article/23703/compilation-problem-undefined-reference-to-imp.html

QT += qt3support

Автор: Flatus 5.5.2017, 12:05

Цитата(Бублик @ 20.11.2012, 15:14) *
А ни у кого не было проблемы при использования QZipReader?

./debug\XXXX.o:C:\projects\XXXX.cpp:410: undefined reference to `_imp___ZN10QZipReaderC1EP9QIODevice'
./debug\XXXX.o:C:\projects\XXXX.cpp:411: undefined reference to `_imp___ZNK10QZipReader8fileDataERK7QString'
./debug\XXXX.o:C:\projects\XXXX.cpp:424: undefined reference to `_imp___ZN10QZipReaderD1Ev'
./debug\XXXX.o:C:\projects\XXXX.cpp:424: undefined reference to `_imp___ZN10QZipReaderD1Ev'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\Exchange.exe] Error 1
mingw32-make: *** [debug] Error 2
15:55:20: The process "C:\projects\qtsdk\mingw\bin\mingw32-make.exe" exited with code 2.


В чем может быть беда?

В файле *.pro :
QT += gui-private

В исходнике подклчать заголовочные файлы как:
#include <QtGui/private/qzipwriter_p.h>
#include <QtGui/private/qzipreader_p.h>

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)