Как сжать несколько файлов для архивирования в Qt? - PullRequest
1 голос
/ 11 января 2011

Мне нужно сжать несколько файлов в Qt.Я пытаюсь Quazip.Но zip-файл содержит файлы размером 0 КБ.Что-то идет не так.Может ли кто-нибудь помочь мне здесь!Код для архивирования приведен здесь:

QString testZip = location + "/tempTheme/test.zip";
            QuaZip zip(testZip);
            zip.setFileNameCodec("IBM866");            
            if(!zip.open(QuaZip::mdCreate)) {
              qWarning("testCreate(): zip.open(): %d", zip.getZipError());
            }
            zip.setComment("Test comment");
            QFileInfoList files=QDir(location + "/tempTheme/").entryInfoList();
            QFile inFile;
            QuaZipFile outFile(&zip);
            char c;
            foreach(QFileInfo file, files) {
              if(!file.isFile()||file.fileName()=="test.zip") continue;
              inFile.setFileName(file.fileName());
              if(!inFile.open(QIODevice::ReadOnly)) {
                qWarning("testCreate(): inFile.open(): %s", inFile.errorString().toLocal8Bit().constData());
              }
              if(!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(inFile.fileName(), inFile.fileName()))) {
                qWarning("testCreate(): outFile.open(): %d", outFile.getZipError());
              }
              while(inFile.getChar(&c)&&outFile.putChar(c));
              if(outFile.getZipError()!=UNZ_OK) {
                qWarning("testCreate(): outFile.putChar(): %d", outFile.getZipError());
              }
              outFile.close();
              if(outFile.getZipError()!=UNZ_OK) {
                qWarning("testCreate(): outFile.close(): %d", outFile.getZipError());
              }
              inFile.close();
            }
            zip.close();
            if(zip.getZipError()!=0) {
              qWarning("testCreate(): zip.close(): %d", zip.getZipError());
             QMessageBox msgInfo;
             msgInfo.information(this, "blah", "done");
            }

Ответы [ 3 ]

3 голосов
/ 11 января 2011

Если этот проект всего лишь игрушка, то, возможно, хорошо работать с символом за раз, но я не могу представить, что добавление одного миллиона символов за один раз в менеджер файлов zip будет очень эффективным. И сегодня файл размером в один мегабайт выглядит очень маленьким. Так что поищите в QuaZip API механизмы, позволяющие добавлять файлы непосредственно в zip-архивы или, по крайней мере, большие буферы данных одновременно. (Буферизация Qt сохраняет системные вызовы, но миллион вызовов функций, работающих с одним символом, против 128 вызовов функций, работающих с 8k буферами, будет заметен в большинстве программ.)

0 голосов
/ 10 апреля 2013

Как уже упоминалось ранее, если это игрушечное приложение, можно писать char-to-char. Но на самом деле это действительно трата ресурсов.

Мое решение:

(QuaZipFile) zipout->write( (QFile)inFile->readAll() );

Он читает весь файл с помощью QFile, чем записывает с помощью QuaZipFile.

0 голосов
/ 11 января 2011

Я получил ответ, мне нужно внести следующие изменения,

QString testZip = location + "/test.zip";
            QuaZip zip(testZip);
            zip.setFileNameCodec("IBM866");
            if(!zip.open(QuaZip::mdCreate)) {
              qWarning("testCreate(): zip.open(): %d", zip.getZipError());
            }
            //zip.setComment("Test comment");
            QFileInfoList files=QDir(location + "/tempTheme/").entryInfoList();
            QFile inFile;
            QFile inFileTmp;
            QuaZipFile outFile(&zip);
            char c;
            foreach(QFileInfo file, files) {
              if(!file.isFile()) continue;
              inFileTmp.setFileName(file.fileName());
              inFile.setFileName(file.filePath());
              if(!inFile.open(QIODevice::ReadOnly)) {
                qWarning("testCreate(): inFile.open(): %s", inFile.errorString().toLocal8Bit().constData());
              }
              if(!outFile.open(QIODevice::WriteOnly, QuaZipNewInfo(inFileTmp.fileName(), inFile.fileName()))) {
                qWarning("testCreate(): outFile.open(): %d", outFile.getZipError());
              }
              while(inFile.getChar(&c)&&outFile.putChar(c));
              if(outFile.getZipError()!=UNZ_OK) {
                qWarning("testCreate(): outFile.putChar(): %d", outFile.getZipError());
              }
              outFile.close();
              if(outFile.getZipError()!=UNZ_OK) {
                qWarning("testCreate(): outFile.close(): %d", outFile.getZipError());
              }
              inFile.close();
            }
            zip.close();
            if(zip.getZipError()!=0) {
              qWarning("testCreate(): zip.close(): %d", zip.getZipError());
            }
...