Answers:
存储非BLOB设置的最佳方法(和位置)是什么?
在Windows上,使用注册表似乎可以接受。我认为注册表是一个设计较差的系统,因此Users\Username\AppData
应首选目录中的简单文本文件。这更易于备份,对用户进行修改的危险性较小,并且易于清理。
在Linux和大多数Unixes上,首选位置是/home/user/.config/appname
针对特定于用户的设置以及/etc/
针对全局(系统范围)的设置。用户设置的位置不太理想(但可以接受)是~/.appname
,但这通常不受欢迎。这些文件应该是用户可编辑的,因此始终首选人类可读的格式。
我与大多数人不同意XML是用于存储非blob数据的可接受格式。在我看来,这是一种过度使用且过于复杂的格式,通常最终只能是很小的结构化数据。我更喜欢使用YAML,JSON,ASN.1,name = value对或类似格式的文件。语法过多会使用户很容易弄乱并使文件保持无效格式。
我们应该遵循每个系统默认值还是拥有统一的解决方案?
这完全取决于您,但请记住以下几点:
/var/
。不可更改的数据文件应保存在您的应用程序目录中/usr/share/
,/usr/local/share/
或/opt/
/etc/
应该永远不会被应用程序写入时,它正在运行,即使它有给他们写访问。/etc/
应该是默认行为的存储库,仅此而已。/usr/local/
,/opt/appname
或/home/username/appname
。Users\User\AppData
。没有其他地方似乎可以接受。~/Library/Preferences
与其他所有应用程序的plist文件一起存储。plist
似乎是首选格式,但您需要仔细检查Apple准则。最好的便携式方法是什么?
老实说,没有“最好的”。只有特定于平台的限制和期望。我的建议是坚持使用特定于平台的方法,即使这意味着编写更多代码。
%APPDATA%
> 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文件,而是使用注册表
在Windows下,使用%APPDATA%\appname
。在* NIX下,使用~/.appname
。不要在任何一个平台上使用固定目录名称,因为用户的主目录可能与默认目录不同(例如,它可能在网络上)。
至于格式,请使用您认为最好的格式。这是只有您可以在应用程序上下文中做出的决定。如果“标准”方式不是最适合您特定程序的方式,则没有必要,而且实际上也不可取。
例如,如果您的应用程序已经将XML / JSON用于其他用途,那么XML / JSON可能是存储用户数据/配置的一种好方法。但是,如果它是一个简单的配置文件,为什么要通过引入依赖关系将膨胀添加到您的应用程序中?在这种情况下,最好只使用带有var: value\n
行的简单文本文件。
编辑:没有“最佳”可移植方式,因为操作系统为此使用非常不同的约定。没有流血的充分理由,不要违反操作系统标准。
EDIT2:如果您发现自己在/etc
或中进行了系统范围的设置HKEY_LOCAL_MACHINE
,请询问您设置是否真正是全局的。然后等待5分钟,然后再次问自己。如果答案仍然是肯定的,那么请务必进行全局设置。请记住,普通用户没有/etc
或的写权限,HKEY_LOCAL_MACHINE
并且这样做是要确保没有管理员权限的人无法安装您的应用。
~/.config/applicaton
越来越成为* nix上的首选位置。
~
这么做~/.config/appname
。
我尽量保持注册表中进行,但方式上使用。我希望每个人都会。
我喜欢保留xml配置文件或bin文件,或者偶尔保留本地数据库(SQLite)。
用户设置通常位于
/home/<user>/.<application>
因此,例如,irssi的设置是/home//.irssi/config
/home/<user>/etc/application
呢?
~/.config/application
到帮助保持整合的状态。我倾向于同意这一运动。
AppData
。
对于Java应用程序,我认为gson是一个不错的选择。创建您的设置对象,并使用gson将其转换为JSON,反之亦然。具有人类可读的优点,而不是某些序列化的Blob。
编辑:好的,所以它可能不那么普遍...
如果使用.NET编写,则可以使用System.Environment.SpecialFolders找出可用于保存配置甚至某些数据的文件夹位置。