gpt4 book ai didi

c++ - 将 QFile 内容复制到另一个 QFile,最佳方式是什么?

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

我需要将一个 QFile 成 block 地复制到另一个 QFile,所以我不能使用 QFile::copy。这是最原始的实现:

bool CFile::copyChunk(int64_t chunkSize, const QString &destFolder)
{
if (!_thisFile.isOpen())
{
// Initializing - opening files
_thisFile.setFileName(_absoluteFilePath);
if (!_thisFile.open(QFile::ReadOnly))
return false;

_destFile.setFileName(destFolder + _thisFileName);
if (!_destFile.open(QFile::WriteOnly))
return false;
}

if (chunkSize < (_thisFile.size() - _thisFile.pos()))
{
QByteArray data (chunkSize, 0);
_thisFile.read(data.data(), chunkSize);
return _destFile.write(data) == chunkSize;
}
}

从这个片段中看不清楚,但我只是打算将一个二进制文件作为一个整体复制到另一个位置,只是以 block 的形式复制,这样我就可以为大文件提供进度回调和取消功能。

另一个想法是使用内存映射。我是不是该?如果是这样,那么我应该只映射源文件并仍然使用 _destFile.write,还是应该映射两者并使用 memcpy

我想这个问题与 Qt 无关,我认为答案应该对任何支持内存映射的文件 I/O API 都是通用的。

最佳答案

好吧好吧,如果一定是内存映射方案。这是一个:

QFile source("/tmp/bla1.bin");
source.open(QIODevice::ReadOnly);
QFile destination("/tmp/bla2.bin");
destination.open(QIODevice::ReadWrite);
destination.resize(source.size());
uchar *data = destination.map(0,destination.size());
if(!data){
qDebug() << "Cannot map";
exit(-1);
}
QByteArray buffer;
int chunksize = 200;
int var = 0;
do{
var = source.read((char *)(data), chunksize);
data += var;
}while(var > 0);
destination.unmap(data);
destination.close();

这只会将目标文件映射到内存中。我怀疑映射源文件也会有很大的不同。但这是具体测量的东西,而不是假设。

另一个问题是您是否可以一次将整个文件映射到内存中。不断地取消映射和重新映射肯定会降低性能。即使你使用 Qt。像内存映射这样的函数在不同的平台上有令人不安的不同行为,例如您映射到内存的最大文件大小可能不同。

关于c++ - 将 QFile 内容复制到另一个 QFile,最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18300379/

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