我需要在 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");
}
如果这个项目只是一个玩具,一次一个字符可能没问题,但我无法想象一次向 zip 文件管理器添加一百万个字符会非常高效。如今,一兆字节的文件看起来非常小。因此,请在 QuaZip API 中寻找直接将文件添加到 zip 中的机制,或者至少一次添加大量数据缓冲区的机制。 (Qt 的缓冲节省了系统调用,但在大多数程序中,处理一个字符的 100 万个函数调用和处理 8k 缓冲区的 128 个函数调用将是显而易见的。)
我得到了答案,我需要进行以下更改,
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());
}
如前所述,如果它是一个玩具应用程序,那么可以编写字符到字符。但实际上这确实是浪费资源。
我的解决方案是:
(QuaZipFile) zipout->write( (QFile)inFile->readAll() );
它使用 QFile 读取整个文件,而不是使用 QuaZipFile 写出。
最简单的方法是使用QMicroz。
QStringList _fileList;
_fileList << "file1_path";
_fileList << "file2_path";
...
QMicroz::compress_(_fileList);