c++ - 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中是否有更好的方法来打开“仅附加但读取可缓存”的文件?
解决方案
这是将 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;
}
推荐阅读
- cocoa - Mac App Store 登录中的沙盒用户更改
- java - 将搜索按钮添加到工具栏并单击时开始新活动
- css - 如何在画布上的 webGL 中绘制透明背景
- php - 从循环内的包含文件中获取变量
- powershell - Powershell DSC - 对环境进行逆向工程?
- java - 何时使用 Guice 的即时绑定?
- listview - Nativescript Vue ListView - 预期的数组,得到对象
- r - 如何将 R 设置为从没有 bin 或 root 访问权限的目录运行?
- vuejs2 - 在“创建”值之后创建的 vue2“计算”值
- javascript - 将道具传递给组件的反应返回未定义