Russian Qt Forum
Ноябрь 26, 2024, 04:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QZipReader не всегда распоковует  (Прочитано 2277 раз)
carhun
Гость
« : Май 25, 2013, 17:09 »

Доброго времени суток.

Задача следующая:
Получить с github'a ветку в виде zip файла и распокавать ее. Первую часть я успешно выполнил.

Вопрос по второй части. Пробовал сделать так:
Код:
//    QString destinationDir = filePath;
//    QDir baseDir(destinationDir);

    QZipReader unzip(fileName, QIODevice::ReadOnly);
    unzip.extractAll(filePath);
    unzip.close();
//    QList<QZipReader::FileInfo> allFiles = unzip.fileInfoList();
//    QZipReader::FileInfo fi;

//    foreach (QZipReader::FileInfo fi, allFiles)
//    {
//        const QString absPath = destinationDir + QDir::separator() + fi.filePath;
//        if (fi.isDir)
//        {
//            if (!baseDir.mkpath(fi.filePath))
//                 return;
//            if (!QFile::setPermissions(absPath, fi.permissions))
//                return;
//        }
//    }

//    foreach (QZipReader::FileInfo fi, allFiles)
//    {
//        const QString absPath = destinationDir + QDir::separator() + fi.filePath;
//        if (fi.isFile)
//        {
//            QFile file(absPath);
//            if( file.open(QFile::WriteOnly) )
//            {
//                QApplication::setOverrideCursor(Qt::WaitCursor);
//                file.write(unzip.fileData(fi.filePath), unzip.fileData(fi.filePath).size());
//                file.setPermissions(fi.permissions);
//                QApplication::restoreOverrideCursor();
//                file.close();
//            }
//        }
//    }
//    unzip.close();

Но не закомментированный код, и не незакоментированный код не распоковуют zip файл, полученный с github'а... При том, что если я создам какой-то архив вручную и попрошу его распоковать, то все ОК.

В чем  может быть проблема?

Испольщовать QuaZip ради одной операции распаковать архив не сильно хочется...
Записан
thechicho
Гость
« Ответ #1 : Май 26, 2013, 10:36 »

возможно данные от сервера в gzip приходят?
заголовки ответа можете показать?

может поможет функция
Код:
QByteArray Class::uncompress(const QByteArray &data)
{
    if (data.size() <= 4) {
        qDebug("uncompress: Input data is truncated");
        return QByteArray();
    }

    QByteArray result;

    int ret;
    z_stream strm;
    static const int CHUNK_SIZE = 1024;
    char out[CHUNK_SIZE];

    /* allocate inflate state */
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    strm.avail_in = data.size();
    strm.next_in = (Bytef*)(data.data());

    ret = inflateInit2(&strm, 15 +  32); // gzip decoding
    if (ret != Z_OK)
        return QByteArray();

    // run inflate()
    do {
        strm.avail_out = CHUNK_SIZE;
        strm.next_out = (Bytef*)(out);

        ret = inflate(&strm, Z_NO_FLUSH);
        Q_ASSERT(ret != Z_STREAM_ERROR);  // state not clobbered

        switch (ret) {
        case Z_NEED_DICT:
            ret = Z_DATA_ERROR;     // and fall through
        case Z_DATA_ERROR:
        case Z_MEM_ERROR:
            (void)inflateEnd(&strm);
            return QByteArray();
        }

        result.append(out, CHUNK_SIZE - strm.avail_out);
    } while (strm.avail_out == 0);

    // clean up and return
    inflateEnd(&strm);
    return result;
}
Записан
carhun
Гость
« Ответ #2 : Май 27, 2013, 20:20 »

возможно данные от сервера в gzip приходят?
заголовки ответа можете показать?

может поможет функция
Код:
QByteArray Class::uncompress(const QByteArray &data)
{
    if (data.size() <= 4) {
        qDebug("uncompress: Input data is truncated");
        return QByteArray();
    }

    QByteArray result;

    int ret;
    z_stream strm;
    static const int CHUNK_SIZE = 1024;
    char out[CHUNK_SIZE];

    /* allocate inflate state */
    strm.zalloc = Z_NULL;
    strm.zfree = Z_NULL;
    strm.opaque = Z_NULL;
    strm.avail_in = data.size();
    strm.next_in = (Bytef*)(data.data());

    ret = inflateInit2(&strm, 15 +  32); // gzip decoding
    if (ret != Z_OK)
        return QByteArray();

    // run inflate()
    do {
        strm.avail_out = CHUNK_SIZE;
        strm.next_out = (Bytef*)(out);

        ret = inflate(&strm, Z_NO_FLUSH);
        Q_ASSERT(ret != Z_STREAM_ERROR);  // state not clobbered

        switch (ret) {
        case Z_NEED_DICT:
            ret = Z_DATA_ERROR;     // and fall through
        case Z_DATA_ERROR:
        case Z_MEM_ERROR:
            (void)inflateEnd(&strm);
            return QByteArray();
        }

        result.append(out, CHUNK_SIZE - strm.avail_out);
    } while (strm.avail_out == 0);

    // clean up and return
    inflateEnd(&strm);
    return result;
}

Вроде как zip архив:
Код:
master
codeload.github.com/zer0fl4g/Nanomite/zip
GET
(canceled)
application/zip
https://github.com/zer0fl4g/Nanomite/archive/master.zip
Redirect
197 B
0 B
1.51 s
1.51 s
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.119 секунд. Запросов: 20.