Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将多个文件段复制到单个文件-Qt_C++_C_Linux_Windows_Qt - Fatal编程技术网

C++ 将多个文件段复制到单个文件-Qt

C++ 将多个文件段复制到单个文件-Qt,c++,c,linux,windows,qt,C++,C,Linux,Windows,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::R

我把一个文件分成许多段。我必须把这些文件合并成一个文件。现在我想到的简单代码是:

 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();
 }
QFile文件;
setFileName(fileUrl);
打开(QIODevice::WriteOnly);
for(int j=0;jfileSegment.close();
如果(!Segment[j]->fileSegment.open(QIODevice::ReadOnly))
{
qDebug()文件段.close();
段[j]->fileSegment.remove();
}
上面的代码片段在Windows和Linux上都可以正常工作。但我有一些问题:

1-此方法是否真的有效。如果假定段大小为GB,这将严重影响系统性能,甚至可能损坏文件或因可用RAM不足而失败

2-如果总大小超过2GB,上述方法在某些Linux发行版尤其是Fedora中失败。我还没有测试过自己,但很多人向我报告过


3-在Linux中,如果段位于EXT4文件系统和目标文件(文件将在NTFS系统上写入)上,它可能会失败。在Ubuntu上它没有失败,但许多用户抱怨它失败了。我不能只是复制它。我做错了什么吗。

一般来说,请避免每个问题都有多个子问题,但我会尝试回答不管你的问题

1-此方法是否真的有效。如果假定段大小为GB,这将严重影响系统性能,甚至可能损坏文件或因可用RAM不足而失败

对于大文件来说这是一个非常糟糕的主意。我认为您希望建立块文件读写

2-如果总大小超过2GB,上述方法在某些Linux发行版尤其是Fedora中失败。我还没有测试过自己,但很多人向我报告过

2 GB<(或者是4 GB?)在32位系统上算作大文件,因此他们可能在不支持大文件生成的情况下使用该软件。有必要确保在生成时启用支持。Qt过去有一个配置选项,即
-largefile

3-在Linux中,如果段位于EXT4文件系统和目标文件(文件将在NTFS系统上写入)上,它可能会失败。在Ubuntu上它没有失败,但许多用户抱怨它失败了。我不能只是复制它。我做错了什么吗

是的,这可能是相同的问题,您还需要注意内存碎片,这意味着,即使有2 GB可用内存,您也无法在内存中分配2 GB,但内存碎片不适当。在Windows上,您可能希望在使用32位进程时使用
/largeAddressware
选项

总的来说,最好是建立读写循环,然后你可能会忘记大地址感知等问题。如果你希望为客户端支持大文件,你仍然需要确保Qt可以处理它们。当然,这只在32位上是必要的,因为64位没有实际限制位与当前正在进行的文件大小一致

由于您在注释中请求了一些代码来帮助您继续,下面是一个简单且未经测试的文本块读取和内容从输入文件到输出文件的即时写入版本。我相信这将帮助您继续,以便您能够解决其余问题

QFileInfo fileInfo("/path/to/my/file");
qint64 size = fileInfo.size();
QByteArray data;
int chunkSize = 4096;
for (qint64 bytes = 0; bytes < size, bytes+=data.size()) {
    data = myInputFile.read(chunkSize);
    // Error check
    myOutputFile.write(data);
}
QFileInfo fileInfo(“/path/to/my/file”);
qint64 size=fileInfo.size();
QByteArray数据;
int chunkSize=4096;
对于(qint64字节=0;字节<大小,字节+=data.size()){
data=myInputFile.read(chunkSize);
//错误检查
myOutputFile.write(数据);
}

readAll()应该避免对大文件执行操作-如果由于文件大小过大而导致分配失败(想想堆碎片),那么它也很容易失败。您应该在循环中按块进行读取。如果您的程序有UI(防止阻塞),最好是在辅助线程中进行读取。此外,请检查所有read()和write()的返回值s、 @FrankOsterfeld在循环中每次写入后调用flush可以防止失败或改进上述代码。@adnankamili在每次写入后调用flush有助于防止失败,但也会严重影响您的性能。感谢您提供了这么好的答案。我应该使用Qdatastream来写入数据吗?一个简单的区块文件示例读写就好了。读写速度更快的最佳块大小是多少。@adnankamili:你打算支持二进制文件吗?@adnankamili:我提供了一个未经测试的伪代码来演示这个想法。实际上我只打算支持二进制文件。就大文件而言,我将如何在32位系统上支持它们。-largefile对Li有效吗Qt 4.8.1及以上版本中的nux