Russian Qt Forum

Qt => Общие вопросы => Тема начата: DikBSD от Январь 03, 2009, 18:28



Название: Qt - Работа с zip фрхивами
Отправлено: DikBSD от Январь 03, 2009, 18:28
Подскажите, как можно средствами Qt читать содержимое (распаковывать) zip-архивы и  сжимать многоуровневые папки с файлами в zip.
Спасибо.


Название: Re: Qt - Работа с zip фрхивами
Отправлено: Dendy от Январь 03, 2009, 18:37
У них специальных классов или абстрактных интерфейсов для архивов нету. Ъ-way - переопределить QAbstractFileEngineHandler и изобрести велосипед (найти велосипед в интернете) для работы с архивами как с файлами. Я такой в своё время писал. Работало. Из Zlib наружу у них кажется только qCompressed() торчит.


Название: Re: Qt - Работа с zip фрхивами
Отправлено: Karl-Philipp от Январь 03, 2009, 23:54
QuaZIP (http://quazip.sourceforge.net/) может быть поможет  :)


Название: Re: Qt - Работа с zip фрхивами
Отправлено: CuteBunny от Апрель 28, 2010, 04:34
не хочет этот QuaZip собиратся у меня... юзаю Qt4.6.1+mingw :-\

suxxx


Название: Re: Qt - Работа с zip фрхивами
Отправлено: CuteBunny от Апрель 28, 2010, 08:57
Ладно, кому интересно, в попу этот QuaZip, юзаю 7-Zip + QProcess и никаких проблем


Название: Re: Qt - Работа с zip фрхивами
Отправлено: crossly от Апрель 28, 2010, 12:05
не хочет этот QuaZip собиратся у меня... юзаю Qt4.6.1+mingw :-\

suxxx
а чего не хочет??.... ошибки хоть какие....??


Название: Re: Qt - Работа с zip фрхивами
Отправлено: pastor от Апрель 28, 2010, 12:56
На свой страх и риск можно заюзать заприваченные класы QZipReader и QZipWriter (src\gui\text\qzipwriter_p.h, src\gui\text\qzipreader_p.h)


Название: Re: Qt - Работа с zip фрхивами
Отправлено: ufna от Апрель 28, 2010, 16:53
в 4.6.2 этими классами отлично все управляется, если операции по общей загрузки/выгрузки в архив, оно не умело "по отдельным файлам". Если надо, сброшу реализацию.


Название: Re: Qt - Работа с zip фрхивами
Отправлено: Nimbus от Июнь 28, 2010, 05:12
На свой страх и риск можно заюзать заприваченные класы QZipReader и QZipWriter (src\gui\text\qzipwriter_p.h, src\gui\text\qzipreader_p.h)
Эти классы как-то странно работают. Всё отлично запаковывают, а потом распаковывают. Но reader не может распаковать архивы, запакованные через WinRAR методом ZIP с любым сжатием.

Провёл дебаг - QZipReader получает неправильыне данные о файле в архиве через метод QZipPrivate::fillFileInfo.
Почему-то все значения (isFile, isDir, isSymLink) структуры QZipReader::FileInfo получаются равными нулю.

Ясно, что проблема в получении информации о файлах в архиве.
Код
C++ (Qt)
void QZipReaderPrivate::scanFiles()
{
   //...
   for (i = 0; i < num_dir_entries; ++i) {
       FileHeader header;
       int read = device->read((char *) &header.h, sizeof(CentralFileHeader)); //<- Вот здесь записывается неправильная информация в заголовок
       //...
   }
}
 
Во вложении архив, в архиве 1.zip - это архив запакованный через QZipWriter, а 2.zip - архив, запакованный WinRAR'ом.
Оба прекрасно открываются WinRAR'ом. Но вот, 2.zip не хочет извлекаться QZipReader'ом.

Погуглил, нашёл альтернативные классы для ZIP-архивации. http://code.google.com/p/osdab/source/browse/trunk/OSDaB-Zip
Протестирую - отпишусь.

Работает! Правда, пришлось закомментировать некоторые куски кода, например:
Код
C++ (Qt)
if (!skipEntry && buffer1[UNZIP_CD_OFF_VERSION] > UNZIP_VERSION)
{
qDebug() << "Unsupported PKZip version. Skipping file.";
skipEntry = true;
}
 
Очень хорошие исходники, по которым удобно проводить дебаг.


Название: Re: Qt - Работа с zip фрхивами
Отправлено: ритт от Июнь 28, 2010, 11:23
попробуй применить этот патч - http://qt.gitorious.org/~ritt.k/qt/ritts_qt/commit/4f8968cf2966ba6e564c8aa646fffdce3708fa72
точнее, его часть, касающуюся src/gui/text/qzip.cpp
и протестировать QZipReader с 2.zip ещё раз


Название: Re: Qt - Работа с zip фрхивами
Отправлено: dr_Begemot от Июль 05, 2010, 13:11
Ладно, кому интересно, в попу этот QuaZip, юзаю 7-Zip + QProcess и никаких проблем

Очень интересно, а можно поподробней как юзаете, порядок действий и пример мб?


Название: Re: Qt - Работа с zip фрхивами
Отправлено: Alp от Июль 05, 2010, 13:18
Легко и не напряжно пишется обертка вокруг zlib, тем более, что пример есть - minizip из её же комплекта.
Если есть время - вот моё вариант, разбирайся.


Название: Re: Qt - Работа с zip фрхивами
Отправлено: dr_Begemot от Июль 05, 2010, 13:54
Легко и не напряжно пишется обертка вокруг zlib, тем более, что пример есть - minizip из её же комплекта.
Если есть время - вот моё вариант, разбирайся.

Так вы zlib оешили юзать или 7-zip?
Тот пример что вы мне скинули, там pro-файла под qt нет?


Название: Re: Qt - Работа с zip фрхивами
Отправлено: dr_Begemot от Июль 06, 2010, 11:29
А вы под линуксом собираете или под виндами?


Название: Re: Qt - Работа с zip фрхивами
Отправлено: dr_Begemot от Июль 06, 2010, 11:52
Что за проект zlibstat? Это единственный проект который скомпилился...
При попытке скомпилить minzip пишет cannot open file 'x86\ZlibDllDebug\zlibwapi.lib'
Некоторые другие проекты ругаются на cannot open file '..\..\masmx86\match686.obj'


Название: Re: Qt - Работа с zip фрхивами
Отправлено: dr_Begemot от Июль 06, 2010, 12:23
Пара вопросов:
1. Почему при вызове команды minzip.exe -a my_file.zip appendFile.txt, если файл appendFile.txt уже есть в архиве, то их в архиве становится два?
2. Можно ли содавать поддиректории в архиве? Как?


Название: Re: Qt - Работа с zip фрхивами
Отправлено: dr_Begemot от Июль 06, 2010, 14:33
Легко и не напряжно пишется обертка вокруг zlib, тем более, что пример есть - minizip из её же комплекта.
Если есть время - вот моё вариант, разбирайся.

в Вашем примере не хватает файлов:
#include "addons/PathHolder.h"
#include "Unmacbin/dt/Headers.h"
#include "Unmacbin/dt/Mac2Pc.h"


Название: Re: Qt - Работа с zip фрхивами
Отправлено: Alp от Июль 16, 2010, 12:14
Легко и не напряжно пишется обертка вокруг zlib, тем более, что пример есть - minizip из её же комплекта.
Если есть время - вот моё вариант, разбирайся.

Так вы zlib оешили юзать или 7-zip?
Тот пример что вы мне скинули, там pro-файла под qt нет?
При чем тут вообще 7zip???