我是一个新的 Windows 程序员,我不确定我应该在哪里存储用户可配置的应用程序设置。我了解需要为用户提供一种用户友好的方式来更改应用程序设置,例如 Edit | 设置表格或类似的。但是,在用户点击该表单上的“应用”按钮后,我应该将值存储在哪里?
在 Windows 注册表中存储设置与将它们存储在本地 INI 文件或配置文件或类似文件中的优缺点是什么?
我是一个新的 Windows 程序员,我不确定我应该在哪里存储用户可配置的应用程序设置。我了解需要为用户提供一种用户友好的方式来更改应用程序设置,例如 Edit | 设置表格或类似的。但是,在用户点击该表单上的“应用”按钮后,我应该将值存储在哪里?
在 Windows 注册表中存储设置与将它们存储在本地 INI 文件或配置文件或类似文件中的优缺点是什么?
配置文件的优点:
注册表的优点:
如果您只需要一种简单的方式来存储配置信息,我会推荐一个配置文件,使用 INI 或 XML 作为格式。我建议仅在您想摆脱使用注册表的特定内容时才使用注册表。
Jeff Atwood 有一篇很棒的文章,介绍了 Windows 的注册表以及为什么改用 .INI 文件更好。
如果将每个应用程序的设置存储在一个我可以轻松查看、操作和备份它们的地方,我的生活会轻松很多。比如说……在 INI 文件中。
- 注册表是单点故障。这就是为什么你会发现每一个注册表编辑技巧都以一个关于如何用 regedit 破坏你的计算机的大肥尖叫免责声明开始的原因。
- 注册表是不透明的和二进制的。尽管我不喜欢尖括号税,但至少 XML 配置文件是合理的人类可读的,并且它们允许尽可能多的评论。
- 注册表必须与文件系统同步。删除一个应用程序而不“卸载”它,你就会留下陈旧的注册表。或者,如果应用程序的卸载程序编写不佳。文件系统不再是记录声明——它必须以某种方式与注册表保持同步。这完全违反了 DRY 原则。
- 注册表是单片的。假设您想将应用程序移动到机器上的不同路径,甚至完全移动到不同的机器上。祝您好运,从巨大的注册表 tarball 中提取该特定应用程序的相关设置。一个给定的应用程序通常在注册表中散布着几十个设置。
在注册表中使用 INI 文件还有一个我没有提到的优势:如果用户使用某种基于卷/文件的加密,他们可以很容易地对 INI 文件进行加密。使用注册表可能会出现更多问题。
根据GetPrivateProfileString的文档,您应该使用注册表来存储初始化信息。
但是,话虽如此,如果您仍想使用 .ini 文件,并使用标准配置文件 API(GetPrivateProfileString
、WritePrivateProfileString
等)来访问它们,它们提供了自动提供由支持的“虚拟 .ini 文件”的内置方法注册表。双赢!
使用与应用程序位于同一目录中的 ini 文件,可以将其与应用程序一起备份。因此,在您重新加载操作系统后,您只需恢复应用程序目录,就可以按照您想要的方式进行配置。
我同意丹尼尔。如果它是一个大型应用程序,我想我会在注册表中做一些事情。如果它是一个小型应用程序,并且您希望在不制作配置表单的情况下使其某些方面可由用户配置,请快速获取 INI 文件。
我通常是这样解析的(如果.ini文件中的格式是option = value,每行1个,注释以#开头):
static void Parse()
{
StreamReader tr = new StreamReader("config.ini");
string line;
Dictionary<string, string> config = new Dictionary<string, string>();
while ((line = tr.ReadLine()) != null)
{
// Allow for comments and empty lines.
if (line == "" || line.StartsWith("#"))
continue;
string[] kvPair = line.Split('=');
// Format must be option = value.
if (kvPair.Length != 2)
continue;
// If the option already exists, it's overwritten.
config[kvPair[0].Trim()] = kvPair[1].Trim();
}
}
编辑:对不起,我以为你已经指定了语言。上面的实现是在 C# 中。
正如 Daniel 所指出的,将配置数据存储在注册表中可以让您选择使用管理模板。也就是说,您可以定义一个管理模板,在组策略中使用它并在网络范围内管理您的应用程序的配置。根据应用程序的性质,这可能是一个很大的好处。
现有的答案涵盖了很多领域,但我想我会提到另一点。
我使用注册表来存储系统范围的设置。也就是说,当 2 个或更多程序需要完全相同的设置时。换句话说,多个程序共享的设置。
在所有其他情况下,我使用本地配置文件,该文件与可执行文件位于同一路径或下一层(在配置目录中)。其他答案已经涵盖了原因(便携式,可以使用文本编辑器进行编辑等)。
为什么要将系统范围的设置放入注册表?好吧,我发现如果一个设置是共享的,但你使用本地配置文件,你最终会复制设置。这可能意味着您最终需要在多个地方更改设置。
例如,假设 Program A 和 Program B 都指向同一个数据库。您可以为连接字符串设置“系统范围”的注册表设置。如果要指向不同的数据库,可以在一个地方更改连接字符串,两个程序现在都将针对另一个数据库运行。
注意 - 如果两个或多个程序不需要使用相同的值,那么以这种方式使用注册表是没有意义的。例如,程序 A 和程序 B 都需要一个可能相同但并非总是相同的数据库连接字符串。例如,我希望程序 B 现在使用测试数据库,但程序 A 应该继续使用生产数据库。
在上面的示例中,您可以有一些本地配置覆盖系统范围的设置,但对于简单的任务,它可能会开始变得过于复杂。
注册表针对快速访问和轻松更新进行了优化,它是执行某些特定于 Windows 的操作(例如与扩展关联)的唯一方法。您可以忽略有关删除单个目录以卸载程序的论点 - Windows Vista 不允许您修改 Program Files 目录中的文件,因此您的配置无论如何都需要进入不同的文件夹。
Windows 编程有一个通用指南——按照微软期望的方式做事,你的生活会轻松很多。
也就是说,我可以看到 INI 文件的吸引力,我不会责怪任何人考虑它。
ini 或配置文件有一个缺点,如果用户可以选择程序的安装位置,那就是定位它们。
使用注册表的另一个缺点是,如果您在 32 位和 64 位应用程序的混合环境中工作,会很痛苦,因为访问注册表的系统调用会随机(*) 添加\Wow6432Node\
到您的注册表路径中,让您在调试时发疯.
(*当然不是随机的,但是很容易迷路)
好处:
缺点: