首页 > 解决方案 > QT QIODevice 等效于“a+”(读取,但仅附加)

问题描述

我们有一个非常高性能的应用程序——或者更准确地说,是一个需要写入日志文件的可扩展应用程序。

每个实例都有自己的日志文件,但是在查看性能指标时,我们偶尔会看到写入时间非常慢。日志文件将发送到共享磁盘,以便我们可以在假脱机虚拟机消失时查看日志(使用它的磁盘)

在通过云提供商进行此操作时,他们建议应使用“a+”模式打开日志文件,网址:https ://www.cplusplus.com/reference/cstdio/fopen/ 。

"a+" 追加/更新:打开一个文件进行更新(输入和输出),所有输出操作都在文件末尾写入数据。重新定位操作(fseek、fsetpos、rewind)会影响下一个输入操作,但输出操作会将位置移回文件末尾。如果文件不存在,则创建该文件。

这允许共享磁盘资源缓存写入;显然“只写”模式没有,这就是我们的问题 - 成千上万的客户端,每个客户端都必须在下一个可以写入它的日志文件之前持久保存到磁盘。

我找不到与 QIODevice 的打开标志等效的东西。我能做的最好的就是读/写,这与a+不同。

https://doc.qt.io/qt-5/qiodevice.html#OpenModeFlag-enum

QT中是否有更好的方法来打开“仅附加但读取可缓存”的文件?

标签: c++qtfopen

解决方案


这是将 QIODevice::OpenMode 转换为类 unix 操作系统的 stdio 标志的函数
我不确定它是否转换QIODevice::ReadWrite | QIODevice::Append"a+",但就是这样:

static inline int openModeToOpenFlags(QIODevice::OpenMode mode)
{
    int oflags = QT_OPEN_RDONLY;
#ifdef QT_LARGEFILE_SUPPORT
    oflags |= QT_OPEN_LARGEFILE;
#endif
    if ((mode & QFile::ReadWrite) == QFile::ReadWrite)
        oflags = QT_OPEN_RDWR;
    else if (mode & QFile::WriteOnly)
        oflags = QT_OPEN_WRONLY;
    if (QFSFileEnginePrivate::openModeCanCreate(mode))
        oflags |= QT_OPEN_CREAT;
    if (mode & QFile::Truncate)
        oflags |= QT_OPEN_TRUNC;
    if (mode & QFile::Append)
        oflags |= QT_OPEN_APPEND;
    if (mode & QFile::NewOnly)
        oflags |= QT_OPEN_EXCL;
    return oflags;
}

这是整个源代码:https ://code.woboq.org/qt5/qtbase/src/corelib/io/qfsfileengine_unix.cpp.html#_ZL19openModeToOpenFlags6QFlagsIN9QIODevice12OpenModeFlagEE


推荐阅读