gpt4 book ai didi

c++ - 如何报告在 QuaGzipFile(QuaZIP 库)上读取数据的进度

转载 作者:行者123 更新时间:2023-11-30 04:09:38 32 4
gpt4 key购买 nike

我在 Ubuntu 12.04 x86_64 上使用 QuaZIP 0.5.1 和 Qt 5.1.1 for C++。

我的程序读取一个大的 gzip 二进制文件,通常是 1GB 或更多的未压缩数据,并对其进行一些计算。它不是计算密集型的,大部分时间都在 I/O 上传递。因此,如果我能找到一种方法来报告读取了多少文件数据,我可以在进度条上报告它,甚至提供预计到达时间。

我打开文件:

QuaGzipFile gzip(fileName);
if (!gzip.open(QIODevice::ReadOnly))
{
// report error
return;
}

但是 QuaGzipFile 中没有查找文件大小和当前位置的功能。

我不需要找到未压缩流的大小和位置,压缩流的大小和位置就可以了,因为粗略估计进度就足够了。

目前,我可以使用 QFile(fileName).size() 找到压缩文件的大小。此外,通过保留 gzip.read() 的返回值总和,我可以轻松找到未压缩流中的当前位置。但是这两个数字不匹配。

如果有帮助,我可以更改 QuaZIP 库,并访问与 zlib 相关的内部内容。

最佳答案

没有可靠的方法来确定未压缩流的总大小。参见 this answer了解详细信息和可能的解决方法。

但是,有一种方法可以获取压缩流中的位置:

QFile file(fileName);
file.open(QFile::ReadOnly);
QuaGzipFile gzip;
gzip.open(file.handle(), QuaGzipFile::ReadOnly);
while(true) {
QByteArray buf = gzip.read(1000);
//process buf
if (buf.isEmpty()) { break; }
QFile temp_file_object;
temp_file_object.open(file.handle(), QFile::ReadOnly);
double progress = 100.0 * temp_file_object.pos() / file.size();
qDebug() << qRound(progress) << "%";
}

想法是手动打开文件并使用文件描述符来获取位置。 QFile 无法跟踪外部位置变化,因此 file.pos() 将始终为 0。因此我们从文件描述符创建 temp_file_object 以强制 QFile 请求文件位置。我可以使用一些较低级别的 API(例如 lseek())来获取文件位置,但我认为我的方法更跨平台。

请注意,此方法不是很准确,并且可以提供比实际更大的进度值。这是因为 zlib 可以在内部读取和解码比您已经读取的更多的数据。

关于c++ - 如何报告在 QuaGzipFile(QuaZIP 库)上读取数据的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21090556/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com