我有一個文件拆分成多個段。我必須將這些文件合併到一個文件中。現在我想出的簡單代碼是:將多個文件段複製到一個文件中 - 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