2

我正在制作一个存储缓存和设置文件的(qt)跨平台应用程序。经过大量搜索,我仍然没有找到存储它们的方式和位置。请注意,我只想在我会重新发明轮子或节省大量时间的情况下使用 QT 的东西;我希望绝对控制应用程序的行为,而 qt 有时相当随机或效率低下。

对于 linux,默认值为 /etc//,但那里没有写访问权限,我的应用程序会将更改写入它的配置文件。对于缓存,这将是 /var//,但默认情况下也没有写访问权限。设置和缓存最好是用户独立的,因为它是服务器软件。

我已经想到了几种解决方案,但它们似乎不是很优雅:

  • 让安装程序创建具有正确权限的目录(这意味着我将需要一个安装程序...... bleh)
  • 将其全部存储在用户的主目录中,失去用户独立性
  • 让QT处理(我真的不喜欢这个)

有任何想法吗?什么是最佳做法?这些东西在 windows 和 mac 上去哪里了?

一些澄清: 它是一个服务器应用程序,应该独立于单个用户运行,因此根本不希望在 /home 中存储任何内容。它也没有使用 QT 的任何 gui 功能,服务器将由设置文件或通过 IP 与服务器通信的单独 GUI 管理。

4

4 回答 4

2

如果您真的想使用这些文件夹,您的应用程序应该以 root 权限部分或完全执行。

您可以做的另一件事是:

  • 为您的应用程序设置一个工作目录myDir,所有内容都存储在此工作目录中(如果您想要一个示例,qtcreator 会这样做)。
  • 将您的目录保存在非用户特定的位置。我认为/opt 是一个不错的人选
  • myDir用户组设置了所需的访问\修改\执行文件所需的权限。
  • myDir本身需要root才能删除,而不是里面的文件。
  • 使用QSettings为您的 Qt 应用程序进行设置

没有安装程序,您将成为安装程序:四处执行脚本和命令,并最终编写安装文档(我们现在在启动时这样做,这很痛苦,我们正在更改为完整安装程序模式)

注意:不是专家,但是使用两种类型的机器作为服务器似乎你们真的在找麻烦。或者您的应用程序可能针对所有类型的服务器?

于 2012-10-16T12:58:42.103 回答
0

我不认为有一个现成的 Qt 类可以做到这一点,它遵循与每个平台相同的行为。

但是我认为您可以尝试将其统一为您自己在不同平台上的应用程序,例如,在 $HOME/.yourapp 目录或类似的目录中。对于这种方式, QDesktopServices::storageLocation() 可以帮助你一点。

http://doc.qt.digia.com/4.7/qdesktopservices.html#storageLocation

希望能帮助到你。

于 2012-10-16T15:32:31.223 回答
0

为什么不将其与可执行文件存储在同一文件夹中:

QString fileName;

fileName = qApp->applicationDirPath();

fileName += "...what you want...";

QFile* file = new QFile(fileName);
于 2012-10-17T00:14:51.723 回答
0

用户应用程序不会在 /etc 或 /var 中存储用户可写数据,例如配置文件或缓存,它们通常使用并且应该使用 $HOME/.appname,或者现在经常使用的 $HOME/.config/appname (config ) 和 $HOME/.local/ (用于数据)。如果您使用 QSettings 并设置应用程序名称等,Qt 应该在这里做好配置数据的工作。 /etc 用于守护程序、系统配置等,而不是用于用户应用程序。/usr/share 等中可能存在只读默认配置,但用户永远无法写入。当系统上的多个用户同时运行应用程序时,共享用户可写数据也会给您带来很多同步/锁定问题。

在 OS X 上的 Windows 上,用户可写配置/数据也进入用户目录中的文件夹,在 Mac 上为 $HOME/Library/Application\ Support,注册表加上 C:\users\$Username\Application Data在 Windows 上(确切路径取决于 Windows 版本。环境变量 %APPDATA% 指向该位置))。

要偏离这些标准,对于用户/UI 应用程序(与系统范围的守护程序/服务相反,使用 /etc、/var 是常见做法)您应该有非常充分的理由,因为它们会与预期的相矛盾系统,尤其是在 Linux 和 OS X 上,您需要在 OS X 上安装一个安装程序,这对于那里的用户应用程序来说非常罕见。用户,尤其是管理员会讨厌你。

于 2012-10-16T14:10:23.863 回答