每个平台的默认文件位置?

时间:2012-10-16 12:31:33

标签: qt cross-platform conventions application-settings

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

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

我想过几个解决方案,但它们似乎并不优雅:

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

任何想法?什么是最佳做法?这些东西在windows和mac上的位置在哪里?

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

4 个答案:

答案 0 :(得分:2)

如果您确实想要使用这些文件夹,则应使用root权限部分或完全执行应用程序。

你可以做的另一件事是:

  • 为您的应用程序设置工作目录myDir,并且所有内容都存储在此工作目录中(如果您想要一个示例,则与qtcreator相同)。
  • 将您的目录保存在非用户特定位置。我想/opt is a good candidate
  • myDir中,为用户组设置了所需的访问\ modify \ execute文件的权限。
  • myDir本身需要root才能删除,而不是内部文件。
  • 使用QSettings
  • 使您的Qt应用程序的设置自包含

如果没有安装程序,您将成为安装程序:继续执行脚本和命令,最终编写安装文档(我们现在在创业公司中这样做,这很痛苦,我们在更改为完全安装程序模式的过程)

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我认为没有一个现成的Qt类来执行它,它遵循与每个平台相同的行为。

但我认为你可以尝试在不同平台上为自己的应用程序统一它,例如,在$ HOME / .yourapp目录中或者像它一样。这样,QDesktopServices :: storageLocation()可以帮到你。

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

希望它有所帮助。

答案 3 :(得分:0)

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

QString fileName;

fileName = qApp->applicationDirPath();

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

QFile* file = new QFile(fileName);