Доброго времени суток.
Задача следующая:
Получить с 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 ради одной операции распаковать архив не сильно хочется...
возможно данные от сервера в 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;
}