保存应用程序设置的最佳方法


17

在Windows中,默认方式是注册表。这使您可以区分系统范围设置和每个用户设置。

在Unix中,应将/ etc文件夹中的文本文件用于系统范围的设置(每用户设置的约定是什么?)。

许多新程序(尤其是为便携式设计的程序)都使用XML文件。

  • 存储非BLOB设置的最佳方法(和位置)是什么?
  • 我们应该遵循每个系统默认值还是拥有统一的解决方案?
  • 最好的便携式方法是什么?

请非常具体什么的意思是用“最好的”。

3
@托尔比约恩:最好的 形容词 \最好的\最高级的好
Wizard79

3
您会对StackExchange网站上“最佳”含义的多样性感到惊讶。

Answers:


23

存储非BLOB设置的最佳方法(和位置)是什么?

在Windows上,使用注册表似乎可以接受。我认为注册表是一个设计较差的系统,因此Users\Username\AppData应首选目录中的简单文本文件。这更易于备份,对用户进行修改的危险性较小,并且易于清理。

在Linux和大多数Unixes上,首选位置是/home/user/.config/appname针对特定于用户的设置以及/etc/针对全局(系统范围)的设置。用户设置的位置不太理想(但可以接受)是~/.appname,但这通常不受欢迎。这些文件应该是用户可编辑的,因此始终首选人类可读的格式。

我与大多数人不同意XML是用于存储非blob数据的可接受格式。在我看来,这是一种过度使用且过于复杂的格式,通常最终只能是很小的结构化数据。我更喜欢使用YAML,JSON,ASN.1,name = value对或类似格式的文件。语法过多会使用户很容易弄乱并使文件保持无效格式。

我们应该遵循每个系统默认值还是拥有统一的解决方案?

这完全取决于您,但请记住以下几点:

  • * nix之类的平台对可写位置有严格的限制。比Windows更严格。所以:
    • 您唯一应写的内容是用户的主目录中。
    • 除非您的应用程序是系统服务;在这种情况下,所有可变数据文件都应写入/var/。不可更改的数据文件应保存在您的应用程序目录中/usr/share//usr/local/share//opt/
    • 在配置文件中/etc/应该永远不会被应用程序写入时,它正在运行,即使它有给他们写访问。/etc/应该是默认行为的存储库,仅此而已。
    • 安装在三个位置之一为您的应用方案:/usr/local//opt/appname/home/username/appname
    • 如果要更改Blob,则应将其与其他配置文件一起存储。这是通常优选使用用户可编辑的格式,所以像的SQLite或Berkeley DB的优选(因为存在用于每个命令行工具),但不必需的。
  • 在Windows上,您的应用程序只应写入用户目录。数据文件的标准化位置是Users\User\AppData。没有其他地方似乎可以接受。
  • 在Mac OS X上,您的应用程序设置应~/Library/Preferences与其他所有应用程序的plist文件一起存储。plist似乎是首选格式,但您需要仔细检查Apple准则。

最好的便携式方法是什么?

老实说,没有“最好的”。只有特定于平台的限制和期望。我的建议是坚持使用特定于平台的方法,即使这意味着编写更多代码。


1
我认为微软几年来一直不鼓励使用注册表,这很好。正如您提到的,写入AppData是必经之路。在.NET中(也许也在Windows API中?),甚至有一种返回正确路径的方法。
MetalMikester,2010年

还有一个环境变量:%APPDATA%
greyfade 2010年

@MetalMikester-是的,绝对可以。漫游配置文件也支持域环境的AppData。
JBRWilkinson

设置!=配置
Yousha Aleayoub

> In my opinion, the registry was a poorly-devised system, and instead a simple text file in the Users\Username\AppData directory should be preferred. @greyfade-长期的Windows API开发人员Raymond Chen解决了这个问题,并解释了为什么在注册表上使用文本文件不是更好的设计模式:为什么不赞成使用INI文件,而是使用注册表
Mick

8

在Windows下,使用%APPDATA%\appname。在* NIX下,使用~/.appname。不要在任何一个平台上使用固定目录名称,因为用户的主目录可能与默认目录不同(例如,它可能在网络上)。

至于格式,请使用您认为最好的格式。这是只有可以在应用程序上下文中做出的决定。如果“标准”方式不是最适合您特定程序的方式,则没有必要,而且实际上也不可取。

例如,如果您的应用程序已经将XML / JSON用于其他用途,那么XML / JSON可能是存储用户数据/配置的一种好方法。但是,如果它是一个简单的配置文件,为什么要通过引入依赖关系将膨胀添加到您的应用程序中?在这种情况下,最好只使用带有var: value\n行的简单文本文件。

编辑:没有“最佳”可移植方式,因为操作系统为此使用非常不同的约定。没有流血的充分理由,不要违反操作系统标准。

EDIT2:如果您发现自己在/etc或中进行了系统范围的设置HKEY_LOCAL_MACHINE,请询问您设置是否真正是全局的。然后等待5分钟,然后再次问自己。如果答案仍然是肯定的,那么请务必进行全局设置。请记住,普通用户没有/etc或的写权限,HKEY_LOCAL_MACHINE并且这样做是要确保没有管理员权限的人无法安装您的应用。


第一段允许使用Path.Combine或类似的东西,从而将相对根位置一次设置为%APPDATA%或〜,然后让代码完成其余工作,对于EDIT2,确实不存在我知道的跨平台解决方案的。也许有人为此目的编写了跨平台配置库,但这至少是一个好主意……
Tamara Wijsman 2010年

1
@TomWij:当然,任何有能力的开发人员都应该能够弄清楚您不需要在所有地方都使用文字;)。这就是变量的用途。
Chinmay Kanchi 2010年

1
~/.config/applicaton越来越成为* nix上的首选位置。
greyfade 2010年

@greyfade:我从未真正意识到这一点,但是你是对的。在我的机器,对应用程序的四分之一,在存储配置数据~这么做~/.config/appname
Chinmay Kanchi 2010年

一大堆应用程序在Windows中都使用〜/ .appname(相当于您的用户个人资料目录,而不是文档),这非常烦人。这些文件夹不会隐藏自己!
艾伦·皮尔斯

3

我尽量保持注册表中进行,但方式上使用。我希望每个人都会。

我喜欢保留xml配置文件或bin文件,或者偶尔保留本地数据库(SQLite)。


+1,用于阻止注册表。我现在找不到它,但是我似乎记得记得读过MS的某人承认注册表错误。
Chinmay Kanchi 2010年

1
除了XML部分,您同意。我将使用ini(或简单的文本文件)来实现简单的设置要求,并使用SQLite来实现复杂的应用程序。
Codism 2010年

他们刚刚承认了吗?我早在1995年就告诉过你!Mac OS Classic正确无误:“首选项”文件夹为您提供了一个集中的位置来存储配置信息,每个应用程序都保存到自己的文件中。 当我第一次看到注册表时,我就像是“微软从未听说过不把所有鸡蛋都放在一个篮子里吗?!?”
梅森惠勒

1
我认为作为放置OS设置(如文件扩展名注册等)的地方,这很好。但是,如果Microsoft将其发布为只读api,他们可能会被起诉并且必须使其可写。
µBio 2010年

@ Chinmay,@ Mason,注册表并不是一个错误,因为注册表所做的FAR不仅仅是存储配置数据(请参阅:组策略,域,复制)。错误是微软如何将其推销给开发人员,以及在使用方面缺乏任何好的标准。它最终成为了应用程序数据的垃圾场,这不是它的初衷。
马特·奥莱尼克

3

我的答案是Chinmay Kanchi的答案和BioBuckyBall的答案的结合

当配置取决于用户时,XML / Json用于简单配置,SQLite用于复杂,较大的配置驻​​留在默认OS应用程序文件夹或默认OS用户文件夹上。两者都可以使用。


2

在Windows中,我会将应用程序设置保留在AppData文件夹中


1

用户设置通常位于

/home/<user>/.<application> 

因此,例如,irssi的设置是/home//.irssi/config


但这是Unix的约定。Windows呢?在Linux中,是否不会在用户主目录中充斥子目录?为什么不/home/<user>/etc/application呢?
Wizard79 2010年

@Lorenzo:泛洪用户的主目录很少有问题。
Chinmay Kanchi 2010年

1
配置设置越来越多地转移~/.config/application到帮助保持整合的状态。我倾向于同意这一运动。
greyfade 2010年

1
@Lorenzo:这与Windows中将配置文件存储在Windows中的约定完全相同AppData
greyfade 2010年

1
@克里斯:没办法!:-)
Wizard79 2010年

1

我认为最好使用首选的特定于平台的机制。例如,在OS X上,首选的机制是将属性列表放在〜/ Library / Preferences中,并且Cocoa API具有非常简单的界面,用于从那里存储和检索设置。

如果您的应用程序是跨平台的,则可以使用类或其他类将其抽象化。


0

我写到注册表的唯一一件事就是应用程序的位置,以便安装程序和更新程序可以轻松找到它。其他所有内容都存储在/ AppData / Company / App中的文件中


-2

对于Java应用程序,我认为gson是一个不错的选择。创建您的设置对象,并使用gson将其转换为JSON,反之亦然。具有人类可读的优点,而不是某些序列化的Blob。

编辑:好的,所以它可能不那么普遍...


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.