我有一个文件拆分成多个段。我必须将这些文件合并到一个文件中。现在我想出的简单代码是:将多个文件段复制到一个文件中 - Qt
QFile file;
file.setFileName(fileUrl);
file.open(QIODevice::WriteOnly);
for(int j=0;j<totalSegments;j++)
{
Segment[j]->fileSegment.close();
if(!Segment[j]->fileSegment.open(QIODevice::ReadOnly))
{
qDebug()<<"Segment not found";
continue;
}
file.write(Segment[j]->fileSegment.readAll()); // is this really efficient and safe
Segment[j]->fileSegment.close();
Segment[j]->fileSegment.remove();
}
上面的代码片段在Windows和Linux上都能正常工作。但我有一些问题:
1-该方法是否真的有效。如果假设段的大小是以GB为单位的话,这会严重影响系统的性能,甚至可能由于RAM较少而损坏文件或失败。
2-上述方法在某些Linux发行版特别是Fedora中失败,如果总大小超过2GB。我没有测试过自己,但被许多人报告给我。
3-在Linux可以如果段上的文件系统EXT4和目标文件到其中的文件将NTFS系统上被写入它失败。它在Ubuntu上并没有失败,但许多用户抱怨说它确实如此。我不能只复制它。难道我做错了什么。
readAll()在大文件上应该避免 - 如果由于巨大的大小(认为堆碎片)导致分配失败,它也可能容易失败。您应该循环阅读chunk-wise。最好在辅助线程中,如果你的程序有一个UI(以防止它被阻塞)。另外,检查所有read()和write()的返回值。后在循环每次写入防止失败的机会或改善上述代码 –
@FrankOsterfeld不调用平齐。 –
@adnankamili在每次写入_helps_之后调用flush以防止失败,但也会严重影响您的性能。 – Massa