如何在Qt中将几个文件压缩为zip?

问题描述 投票:0回答:4

我需要在 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");
            }
qt compression zip
4个回答
3
投票

如果这个项目只是一个玩具,一次一个字符可能没问题,但我无法想象一次向 zip 文件管理器添加一百万个字符会非常高效。如今,一兆字节的文件看起来非常小。因此,请在 QuaZip API 中寻找直接将文件添加到 zip 中的机制,或者至少一次添加大量数据缓冲区的机制。 (Qt 的缓冲节省了系统调用,但在大多数程序中,处理一个字符的 100 万个函数调用和处理 8k 缓冲区的 128 个函数调用将是显而易见的。)


1
投票

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

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

0
投票

如前所述,如果它是一个玩具应用程序,那么可以编写字符到字符。但实际上这确实是浪费资源。

我的解决方案是:

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

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


0
投票

最简单的方法是使用QMicroz

QStringList _fileList;
_fileList << "file1_path";
_fileList << "file2_path";
...

QMicroz::compress_(_fileList);
© www.soinside.com 2019 - 2024. All rights reserved.