如何解决QT QIODevice 等效于“a+”读取,但仅附加
我们有一个非常高性能的应用程序 - 或者更准确地说,一个需要写入日志文件的可扩展应用程序。
每个实例都有自己的日志文件,但在查看性能指标时,我们偶尔会看到写入时间很慢。日志文件将转到共享磁盘,以便我们可以在假脱机的 VM 消失(连同它的磁盘)时查看日志
在通过云提供商解决此问题时,他们建议应以“a+”模式打开日志文件,根据:https://www.cplusplus.com/reference/cstdio/fopen/。
"a+" append/update: 打开一个文件进行更新(输入输出都可以) 所有输出操作都在文件末尾写入数据。 重新定位操作(fseek、fsetpos、rewind)影响下一个 输入操作,但输出操作将位置移回 文件结束。如果文件不存在,则创建该文件。
这允许共享磁盘资源缓存写入;显然“只写”模式没有,这就是我们的问题 - 数以千计的客户端,在下一个可以写入其日志文件之前,每个客户端都必须坚持到磁盘。
我找不到 QIODevice 的打开标志的等效项。我能做的最好的是读/写,这与 a+ 不同。
https://doc.qt.io/qt-5/qiodevice.html#OpenModeFlag-enum
QT 中是否有更好的方法来打开“仅附加但读取可缓存”的文件?
解决方法
这是将 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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。