将 QFile 内容复制到另一个 QFile,最佳方法是什么?
Copying QFile contents to another QFile, what's the optimal way?
我需要将一个QFile
分块复制到另一个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;
}
}
从这个片段中还不清楚,但我只打算将二进制文件作为一个整体复制到另一个位置,只是分块复制,这样我就可以为大文件提供进度回调和取消功能。
另一个想法是使用内存映射。我应该吗?如果是,那么我应该只映射源文件并仍然使用_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。像内存映射这样的函数在不同的平台上有着令人不安的不同,例如,映射到内存的最大文件大小可能不同。
最佳方法是什么,总是有点取决于旁观者。这里至少有一种较短的工作方法:
QFile source("/tmp/bla1.bin");
source.open(QIODevice::ReadOnly);
QFile destination("/tmp/bla2.bin");
destination.open(QIODevice::WriteOnly);
QByteArray buffer;
int chunksize = 200; // Whatever chunk size you like
while(!(buffer = source.read(chunksize)).isEmpty()){
destination.write(buffer);
}
destination.close();
source.close();
还有内存映射。。。我尽量远离那样的事情。我从来都不太确定他们有多独立于平台。
使用此QFile::map()方法:
QFile fs("Sourcefile.bin");
fs.open(QFile::ReadOnly);
QFile fd("Destinationfile.bin");
fd.open(QFile::WriteOnly);
fd.write((char*) fs.map(0, fs.size()), fs.size()); //Copies all data
fd.close();
fs.close();
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在c代码之间共享数据的最佳方式
- 使用std::source_location报告错误的最佳实践
- 派生类销毁的最佳实践是什么
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 检测win32服务创建和删除的最佳方法
- 在reactor中存储eventHandlers的最佳方式是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在AVX通道中混洗的最佳方式
- 程序顶部的声明与定义(最佳实践)
- 将 QFile 内容复制到另一个 QFile,最佳方法是什么?