Есть QByteArray, содержащий в себе архив zip. в этом архиве есть папка, а в ней файл .xls.
мне нужен файл. подскажите функцию для распаковки. zlib или другую.
QByteArray reportBA = reply->readAll();
этой функцией я qzip разархивирую.
C++ (Qt)
QByteArray MobileThread::uncompress(const QByteArray &data)
{
if (data.size() <= 4) {
qWarning("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;
}
я так пробовал
C++ (Qt)
QByteArray reportBA = reply->readAll();
writeReport("отчеты/" + reportNumber + ".zip", reportBA);
QByteArray reportBAtest1 = qUncompress(reportBA);
writeReport("отчеты/" + reportNumber + "test1.xls", reportBAtest1);
QByteArray reportBAtest2 = uncompress(reportBA);
writeReport("отчеты/" + reportNumber + "test2.xls", reportBAtest2);
void MobileThread::writeReport(QString fileName, QByteArray data)
{
//QReadWriteLock lock;
lock.lockForWrite();
QFile file(fileName);
file.open(QIODevice::WriteOnly);
file.write(data);
file.close();
lock.unlock();
}
qUncompress: Z_DATA_ERROR: Input data is corrupted
C++ (Qt)
QZipReader zip_reader("отчеты/2067410635.zip");
if (zip_reader.exists()) {
// вывод информации об архиве
qDebug() << "Number of items in the zip archive =" << zip_reader.count();
foreach (QZipReader::FileInfo info, zip_reader.fileInfoList()) {
if(info.isFile)
qDebug() << "File:" << info.filePath << info.size;
else if (info.isDir)
qDebug() << "Dir:" << info.filePath;
else
qDebug() << "SymLink:" << info.filePath;
}
// распаковка архива по указанному пути
// QList<QZipReader::FileInfo> zipList = zip_reader.fileInfoList();
// qDebug() << zipList.count() << zipList[0].filePath;
zip_reader.extractAll("отчеты/");
}
почему не извлекает?
вывод:
Number of items in the zip archive = 1
SymLink: "2067410635_1.xls"
пока так сделал
.pro
C++ (Qt)
INCLUDEPATH += $$[QT_INSTALL_PREFIX]/src/3rdparty/zlib \
$$[QT_INSTALL_PREFIX]/src/gui/text
.cpp
C++ (Qt)
#include "qzipreader_p.h"
reportBA = reply->readAll();
QString fileName = "отчеты/" + reportNumber + ".zip";
writeReport(fileName, reportBA);
unzip(fileName, "отчеты");
QFile file(fileName);
file.remove();
void MobileThread::unzip(QString fileName, QString destinationDir)
{
QDir baseDir(destinationDir);
QZipReader zipReader(fileName, QIODevice::ReadOnly);
QList<QZipReader::FileInfo> allFiles = zipReader.fileInfoList();
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;
QFile file(absPath);
if(file.open(QFile::WriteOnly)) {
//QApplication::setOverrideCursor(Qt::WaitCursor);
file.write(zipReader.fileData(fi.filePath), zipReader.fileData(fi.filePath).size());
file.setPermissions(fi.permissions);
//QApplication::restoreOverrideCursor();
file.close();
}
}
zipReader.close();
}
можно как-то сразу из QByteArray распаковать zip архив?