Qfile::readAll QZipWriter 压缩大文件失败
工作中遇到的一个问题:
用 qzipwriter 压缩 dmp 文件,dmp文件比较小的时候正常工作,遇到 3g 的 dmp 文件会压缩结果大小为 0kb
版本一:
QZipWriter *writer = new QZipWriter(zipfile);
QFile qfile(dmpfile);
qfile.open(QIODevice::ReadOnly);
writer->addFile(dmpname, qfile.readAll());
qfile.close();
当 dmp 文件太大(如本次出现问题的3g),qfile.readAll() 读取失败,导致压缩结果为 0kb
另外:
writer->addFile(dmpname, &qfile);
也会压缩失败,因为 QZipWriter::addFile(const QString &fileName, QIODevice * device)
的实现,也会调用 readAll()
,无法读取大文件
版本二:
QZipWriter *writer = new QZipWriter(zipfile);
QFile qfile(dumfile);
qfile.open(QIODevice::ReadOnly);
int readSize = 1024 * 1024 * 500;
int count = 0;
while (!qfile.atEnd())
{
QByteArray data = qfile.read(reasSize);
writer->addFile(dmpname + QString("_%1").arg(++count), data);
}
qfile.close();
将 dmp 文件分段压缩,每段最大 500 MB,
还原方法:windows cmd 命令 copy /b *dmp* all.dmp
结果如下:
最终 dmp 文件可正常用 vs 打开分析