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

סטנ*_*ונן 2 concurrency qt locking file 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();
Run Code Online (Sandbox Code Playgroud)

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

The*_*ght 5

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

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

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

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

因此,这可能会为您解决问题。


סטנ*_*ונן 5

我知道也许有点晚了,但我最近发现了一个有趣的解决方案,即一个名为“Locked File”的组件:

QtLockedFile类通过咨询锁定功能扩展QFile

此类通过进程间文件锁定功能扩展了 QFile 类。如果应用程序要求多个进程访问同一文件,则可以使用 QtLockedFile 轻松确保一次只有一个进程正在写入该文件,并且在其他进程读取该文件时没有进程写入该文件。

class QtLockedFile : public QFile
{
public:
    enum LockMode { NoLock = 0, ReadLock, WriteLock };

    QtLockedFile();
    QtLockedFile(const QString &name);
    ~QtLockedFile();

    bool open(OpenMode mode);

    bool lock(LockMode mode, bool block = true);
    bool unlock();
    bool isLocked() const;
    LockMode lockMode() const;

private:
    LockMode m_lock_mode;
};
Run Code Online (Sandbox Code Playgroud)

此链接将引导您到正确的位置,其中QLockedFile类实现是: https:
//github.com/kbinani/qt-solutions/tree/master/qtlockedfile

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