如何压缩Qt中的几个文件压缩?

时间:2011-01-11 10:29:19

标签: qt compression zip

我需要在Qt中压缩一些文件。我正在尝试Quazip。但是zip文件包含大小为0kb的文件。出了点问题。有人可以帮帮我吗! 压缩的代码在这里给出:

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 个答案:

答案 0 :(得分:3)

如果这个项目只是一个玩具,一次一个字符可能很好,但我无法想象一次一个地添加一百万个字符到一个zip文件管理器会非常有效。而这一天,一兆字节的文件看起来很小。因此,围绕QuaZip API寻找机制,将文件直接添加到zip,或者至少一次添加大量数据缓冲区。 (Qt的缓冲保存了系统调用,但是在一个字符上工作的一百万个函数调用与使用8k缓冲区的128个函数调用在大多数程序中都会很明显。)

答案 1 :(得分:0)

我得到了答案,我需要进行如下更改,

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());
            }

答案 2 :(得分:0)

如前所述,如果它是一个玩具应用程序,可以写char-to-char。但实际上它真的在浪费资源。

我的解决方案是:

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

它使用QFile读取整个文件,而不是使用QuaZipFile写出。