Registry vs. INI文件,用于存储用户可配置的应用程序设置
19344 观看
13回复
2881 作者的声誉
我是一名新的Windows程序员,我不确定应该在哪里存储用户可配置的应用程序设置。我理解需要为用户提供用户友好的方法来更改应用程序设置,例如编辑| 设置表单或类似。但是,在用户点击该表单上的“应用”按钮后,我应该在哪里存储值?
在Windows注册表中存储设置与将其存储在本地INI文件或配置文件或类似文件中的优缺点是什么?
作者: Kurt W. Leucht 的来源 发布者: 2008 年 8 月 9 日回应 13
39像
0 作者的声誉
配置文件的优点:
- 容易做到。不需要知道任何Windows API调用。您只需要知道编程语言的文件I / O接口。
- 便携。如果将应用程序移植到另一个操作系统,则无需更改设置格式。
- 用户可编辑的。用户可以在执行程序之外编辑配置文件。
注册表的优点:
- 安全。除非他/她知道regedit,否则用户不会意外删除配置文件或破坏数据。然后用户只是在寻找麻烦。
- 我不是Windows程序员的专家,但我确信使用注册表可以更容易地执行其他Windows特定的事情(用户特定设置,网络管理等组策略或其他任何事情)。
如果您只需要一种简单的方法来存储配置信息,我建议使用INI或XML作为格式的配置文件。我建议只有在你想要使用注册表的某些特定内容时才使用注册表。
作者: user316 发布者: 2008 年 8 月 9 日4像
186298 作者的声誉
根据GetPrivateProfileString的文档,您应该使用注册表来存储初始化信息。
然而,在这样说,如果你仍然想使用.ini文件,并使用标准的API型材(GetPrivateProfileString
,WritePrivateProfileString
,等)访问它们,它们提供了内置的方式来自动提供后盾“虚拟.ini文件”注册表。双赢!
4像
3511 作者的声誉
2像
804 作者的声誉
我同意丹尼尔。如果它是一个大型应用程序,我想我会在注册表中做一些事情。如果它是一个小型应用程序,并且您希望用户可配置的方面而不需要配置表单,请选择快速的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#中。
作者: deadtime 发布者: 2008 年 8 月 9 日-2像
119602 作者的声誉
您的应用程序是与安装程序一起安装的,还是只是“提取并运行”?在第一种情况下,请查看此处概述的优缺点。但对于Extract和run,在我看来,注册表是一个“禁止”,因为人们希望能够简单地删除应用程序文件夹以摆脱你的程序。
作者: Michael Stum 发布者: 2008 年 8 月 9 日2像
0 作者的声誉
正如Daniel指出的那样,在注册表中存储配置数据可让您选择使用管理模板。也就是说,您可以定义管理模板,在组策略中使用它并在网络范围内管理应用程序的配置。根据应用程序的性质,这可能是一个很大的好处。
作者: JP 发布者: 2008 年 8 月 24 日3像
4034 作者的声誉
在注册表中使用INI文件还有一个优点,我还没有提到过:如果用户使用某种基于卷/文件的加密,他们可以很容易地加密INI文件。使用注册表可能会更有问题。
作者: On Freund 发布者: 2008 年 8 月 24 日24像
15474 作者的声誉
Jeff Atwood有一篇关于Windows注册表的精彩文章,为什么最好使用.INI文件。
作者: Lipis 发布者: 2008 年 10 月 11 日如果将每个应用程序设置存储在一个我可以轻松看到它们,操纵它们并备份它们的地方,那么我的生活将变得更容易。比如,说...在INI文件中。
- 注册表是单点故障。这就是为什么你能找到的每一个注册表编辑提示开头都有一个很大的尖叫免责声明,关于如何用注册表破坏你的计算机。
- 注册表是不透明的二进制文件。尽管我不喜欢尖括号税,但至少XML配置文件是人类可读的,它们允许你认为合适的评论。
- 注册表必须与文件系统同步。删除一个没有“卸载”它的应用程序,你就会留下陈旧的注册表。或者,如果某个应用程序的卸载程序写得不好。文件系统不再是记录语句 - 它必须以某种方式与注册表保持同步。这完全违反了DRY原则。
- 注册表是单一的。假设您希望将应用程序移动到计算机上的其他路径,甚至将其移动到另一台计算机上。祝您从巨大的注册表tarball中提取该特定应用程序的相关设置。给定的应用程序通常有遍布注册表的数十个设置。
1像
230245 作者的声誉
注册表已针对快速访问和轻松更新进行了优化,并且它是执行某些特定于Windows的操作(如与扩展程序关联)的唯一方法。并且您可以忽略关于删除单个目录以卸载程序的争论 - Windows Vista不允许您修改Program Files目录中的文件,因此您的配置无论如何都需要进入不同的文件夹。
有一个Windows编程的一般准则 - 以微软期望的方式做事,你的生活将变得更加容易。
也就是说,我可以看到INI文件的吸引力,我不会责怪任何人考虑它。
作者: Mark Ransom 发布者: 2008 年 10 月 11 日4像
20629 作者的声誉
在与应用程序相同的目录中使用ini文件,可以使用应用程序对其进行备份。因此,在重新加载操作系统后,只需还原应用程序目录,就可以按照自己的方式进行配置。
作者: EvilTeach 发布者: 2008 年 10 月 11 日0像
536 作者的声誉
2像
1569 作者的声誉
现有的答案涵盖了很多方面,但我想我会提到另一点。
我使用注册表来存储系统范围的设置。也就是说,当2个或更多程序需要完全相同的设置时。换句话说,几个程序共享的设置。
在所有其他情况下,我使用本地配置文件,该文件位于与可执行文件相同的路径中,或者位于一个级别(在Configuration目录中)。原因已在其他答案中介绍(便携式,可以使用文本编辑器等进行编辑)。
为什么要将系统范围的设置放入注册表?好吧,我发现如果共享一个设置但你使用本地配置文件,你最终会复制设置。这可能意味着您最终需要在多个位置更改设置。
例如,假设程序A和程序B都指向同一个数据库。您可以为连接字符串设置“系统范围”的注册表设置。如果要指向其他数据库,可以在一个位置更改连接字符串,现在两个程序将针对另一个数据库运行。
注意 - 如果两个或多个程序不需要使用相同的值,则以这种方式使用注册表是没有意义的。例如,程序A和程序B都需要一个可能相同但不总是相同的数据库连接字符串。例如,我希望程序B现在使用测试数据库,但程序A应该继续使用生产数据库。
通过上面的示例,您可以使用一些本地配置覆盖系统范围的设置,但对于简单的任务,它可能会变得过于复杂。
作者: Class Skeleton 发布者: 2016 年 1 月 21 日0像
3470 作者的声誉
使用注册表的另一个缺点是,如果您在32位和64位应用程序的混合环境中工作会很痛苦,因为访问注册表的系统调用将随机(*)添加\Wow6432Node\
到您的注册表路径,使您在调试时发疯。
(*当然不是随机的,但很容易迷路)
作者: Zac 发布者: 2019 年 6 月 26 日来自类别的问题 :
- windows Windows Equivalent of 'nice'
- windows Registry vs. INI文件,用于存储用户可配置的应用程序设置
- windows 如何配置OpenFileDialog来选择文件夹?
- windows 如何在Windows中将Python脚本作为服务运行?
- registry 如何从Windows注册表中读取值
- registry 没有管理员权限可以获得哪些注册表访问?
- registry 使用Java读/写Windows注册表
- settings Best way to save per user options in C#
- settings 如何在Django中使用不同的设置进行单元测试?
- settings VIM在文件末尾禁用自动换行
- configuration-files Java - encrypt / decrypt user name and password from a configuration file
- configuration-files 使用bash脚本修改配置文件
- configuration-files 在Mac OS X上等效XDG_CONFIG_HOME和XDG_DATA_HOME?
- ini 在C ++中解析INI文件的最简单方法是什么?
- ini 在Java中解析INI文件的最简单方法是什么?
- ini 在Python中解析.properties文件