На свой страх и риск можно заюзать заприваченные класы 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;
}
Очень хорошие исходники, по которым удобно проводить дебаг.