问:如何锁定/阻止文件在被写入时被读取?

时间:2015-11-19 13:54:16

标签: qt file concurrency locking read-write

我在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();

我正在考虑使用临时文件并在写入操作完成后重命名它 但也许还有另一个更好/更聪明的想法?用于阅读的某种"锁定文件"也许...?

2 个答案:

答案 0 :(得分:4)

如果您拥有两个应用程序的源代码,那么编写该文件的那个应用程序可以通过已完成编写的许多IPC机制(例如本地套接字)之一向另一个应用程序发出信号。

或者,写入具有不同文件名的文件,然后在写入完成时将文件重命名/复制到读取应用程序所需的位置。

但是,建议在写出文件时使用QSaveFile而不是QFile。正如文件所述: -

  

写入时,内容将被写入临时文件,如果没有发生错误,commit()会将其移动到最终文件

所以这可能会为你解决问题。

答案 1 :(得分:2)

我知道也许有点太晚了,但我最近找到了一个有趣的解决方案:
此链接将引导您到达QLockedFile类实现的正确位置:
https://github.com/kbinani/qt-solutions/tree/master/qtlockedfile

**所以,我决定分享这些信息,也许其他Qt用户感兴趣! **