【问题标题】:Replacement for sync() command [duplicate]替换同步()命令[重复]
【发布时间】:2013-10-31 11:09:56
【问题描述】:

我需要在 Windows 上移植一个应用程序。最初该应用程序是在 Linux 上编写的,它使用 Linux 特定的命令。我用sync() 堆在一个地方。 Windows 没有这样的实用程序。代码看起来像

QSettings *data
...
data->setValue("some_var", var);
data->sync();
sync();

那是一个和平的 C++ 文件。我不懂C++。不是我写的。我使用其他语言。那么我怎样才能让它在 Windows 上工作,或者我怎样才能重写那部分呢?

【问题讨论】:

  • 它是作为这个项目的一部分编写的函数,还是this(或者其他什么,甚至)?
  • 第二个。将磁盘上的数据与内存同步。项目代码中没有这个功能
  • 我看到了这个答案,但这需要管理权限才能运行。这不是一个选择。可以为 Windows 提供简单的保存功能。但是不知道怎么写

标签: c++ linux windows qt sync


【解决方案1】:

基本上你可以忽略系统特定的sync() 调用。它不是必需的,即使在 linux 上也是如此。 QSettings 为您做正确的事。

【讨论】:

  • 由于问题包括“或者我该如何重写那部分?”,这应该是公认的答案。
  • 不幸的是,Qt which needs 这个解决方法中有一个错误,似乎
  • @x29a 也许是 2013 年。没有 QTBUG 链接,我不会太担心。
【解决方案2】:

如果你可以访问你打开的所有文件,我相信在 Linux 上调用 sync() 与在 Windows 上遍历所有文件句柄并刷新它们是一样的,可能是使用 FlushFileBuffers()

编辑 1

如果您使用 C 文件接口(因为您来自 Linux),fflush() 是您的朋友(您仍然需要访问所有打开的文件。)

编辑 2

我知道您可以拨打_flushall()。不确定它与 Linux 的sync() 是否相似,但它们通常似乎做同样的事情。我对使用以下划线开头的函数也有点谨慎。

【讨论】:

  • _flushall() 看起来很有希望。但我得到了下一个错误:错误 C2039: '_flushall' : is not a member of 'QSettings' 该应用程序是用 Qt 编写的。我应该朝那个方向挖掘
  • 这个。请注意,您需要fflush(或_flushall FlushFileBuffers,因为前者仅将 cstdlib 缓冲区刷新到 OS 缓冲区,而后者将 OS 缓冲区刷新到磁盘。另请注意,您不需要管理员权限 - 您需要管理员权限才能刷新完整卷。
  • @poul 错误代码可能意味着您没有为_flushall() 包含正确的头文件。相信你需要加#include <stdio.h>
  • 我做到了。我的“数据”变量定义为 QSettings *data
  • @poul 我明白了。嗯....那是 Qt 的东西,我对此一无所知 :) 从它的外观上看,QSettings 类确实有一个 sync() 成员,所以也许你错过了 #include <QSettings>?我在看这里:qt-project.org/doc/qt-5.0/qtcore/qsettings.html
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 2019-04-07
  • 2011-01-02
  • 2014-05-31
  • 2019-07-04
  • 1970-01-01
  • 2022-01-04
  • 2010-09-27
相关资源
最近更新 更多