文件复制禁用Qt缓冲

时间:2018-05-02 20:43:40

标签: qt file winapi

我正在使用Qt框架编写文件复制器数据备份软件,并且遇到了一个“缺陷”问题。在数据复制中。

如果我将数据从SSD复制到HDD,则SSD读取数据的速度要快于HDD写入数据的速度。因此,读取的数据在写入HDD之前会填充缓冲区。

这不会成为一个问题,除了数据复制的进度表在缓冲区被填满时停止,然后当它被清空时,它会再次进行填充。所以进度表显示了一堆进度,然后它停止,然后它表示进度,然后停止等。与数据以恒定速率写入时发生的持续进展相比,它看起来相当丑陋。

有没有办法用Qt解决这个问题?我尝试使用FlushFileBuffers,但它没有帮助。

我们从Win32 api获得了CreateFile但是文档说在每次写入磁盘驱动器设备后使用它时效率很低。当单独执行许多写操作时。

我们可以使用FILE_FLAG_NO_BUFFERINGFILE_FLAG_WRITE_THROUGH标记来调用QFile函数,但有没有办法用QFile sourceFile; QFile targetTempFile; // ... QByteArray buffer; for (int count = 0; !(buffer = sourceFile.read(1000000)).isEmpty() && cancel == false; count++) { int readSize = buffer.size(); targetTempFile.write(buffer); //targetTempFile.flush(); setProgressMeters(readSize, fileSize, jobSize); setTimeLabels(startTime.elapsed(),readSize); } &#39进行此操作?

然后我们可以选择完全关闭目标磁盘的缓存为here

最优雅的解决方案是什么?

以下是相关代码:

{{1}}

1 个答案:

答案 0 :(得分:0)

对于Windows上的高性能文件复制,您应该使用CopyFileEx,而不是QFileCopyFileEx将使用较低级别的API,这可能导致现代硬件上的零拷贝复制。请参阅this example of CopyFileEx integration with Qt

要从HANDLE(即QFileDevice / QFile)获取原生QSaveFile,并在ReOpenFile上使用QFile,见this answer