我在Windows 7下使用Qt5
在我当前的项目中,我打开一个二进制文件,以便使用来自TCP套接字的数据填充它...
通常,在填充文件后,我将其关闭,另一个应用程序将读取此二进制文件以进行进一步处理
好吧,问题是:写操作大约需要4-5秒(甚至更多),所以我需要找到一种方法来阻止其他应用程序从二进制文件中读取,直到文件完全填充 ...
下面是代码(但我认为它没有多大帮助):
int error = 0;
unsigned long dataLength;
char dataBuffer[1500];
QFile localFile("datafile.bin");
//
localFile.open(QIODevice::WriteOnly);
while(error == 0)
{
error = readSocket(dataBuffer, &dataLength);
if(error == 0)
{
localFile.write(dataBuffer, dataLength);
}
else
{
error = -1;
}
}
localFile.close();
我正在考虑使用临时文件并在写入操作完成后重命名它 但也许还有另一个更好/更聪明的想法?用于阅读的某种"锁定文件"也许...?
答案 0 :(得分:4)
如果您拥有两个应用程序的源代码,那么编写该文件的那个应用程序可以通过已完成编写的许多IPC机制(例如本地套接字)之一向另一个应用程序发出信号。
或者,写入具有不同文件名的文件,然后在写入完成时将文件重命名/复制到读取应用程序所需的位置。
但是,建议在写出文件时使用QSaveFile而不是QFile。正如文件所述: -
写入时,内容将被写入临时文件,如果没有发生错误,commit()会将其移动到最终文件
所以这可能会为你解决问题。
答案 1 :(得分:2)
我知道也许有点太晚了,但我最近找到了一个有趣的解决方案:
此链接将引导您到达QLockedFile
类实现的正确位置:
https://github.com/kbinani/qt-solutions/tree/master/qtlockedfile
**所以,我决定分享这些信息,也许其他Qt用户感兴趣! **