Russian Qt Forum
Июнь 09, 2024, 13:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Распаковка zip архива  (Прочитано 4364 раз)
thechicho
Гость
« : Январь 15, 2012, 19:44 »

Есть 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
Записан
thechicho
Гость
« Ответ #1 : Январь 15, 2012, 22:34 »

Код
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"
Записан
thechicho
Гость
« Ответ #2 : Январь 16, 2012, 20:00 »

пока так сделал

.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 архив?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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