注册表和INI文件,用于存储用户可配置的应用程序设置
我是一名新的Windows程序员,我不确定应该将用户可配置的应用程序设置存储在哪里。我了解有必要为用户提供一种用户友好的方式来更改应用程序设置,例如"编辑" |"更改"。设置形式或者类似形式。但是,在用户单击该表单上的"应用"按钮之后,我应该在哪里存储这些值?
将设置存储在Windows注册表中与将其存储在本地INI文件或者配置文件或者类似文件中的优缺点是什么?
解决方案
回答
配置文件的优点:
- 容易做。不需要知道任何Windows API调用。我们只需要知道我们编程语言的文件I / O接口即可。
- 便携的。如果将应用程序移植到其他操作系统,则无需更改设置格式。
- 用户可编辑。用户可以在程序执行之外编辑配置文件。
注册表的优点:
- 安全的。除非他/她了解regedit,否则用户不能意外删除配置文件或者破坏数据。然后用户只是在自找麻烦。
- 我不是Windows专家,但是我确信使用注册表使执行Windows特定的其他事情(用户特定的设置,网络管理之类的组策略之类的东西)更容易。
如果只需要一种简单的方法来存储配置信息,我建议使用INI或者XML作为格式的配置文件。我建议仅在我们想摆脱使用注册表的某些特定条件时才使用注册表。
回答
根据GetPrivateProfileString的文档,我们应该使用注册表来存储初始化信息。
但是,这样说来,如果我们仍要使用.ini文件,并使用标准配置文件API(GetPrivateProfileString,WritePrivateProfileString等)来访问它们,则它们提供了自动提供"虚拟" .ini文件"。双赢!
回答
这里有一个类似的问题,涵盖了一些优缺点。
我建议不要使用注册表,除非应用程序绝对需要它。据我了解,由于设置文件的灵活性,Microsoft试图阻止使用注册表。另外,我不建议使用.ini文件,而是建议使用.Net的某些内置功能来保存用户/应用程序设置。
回答
我同意丹尼尔。如果是大型应用程序,我想我会在注册表中执行操作。如果它是一个小型应用程序,并且我们希望它的各个方面可以由用户配置而无需填写配置表,请快速获取一个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指出的,在注册表中存储配置数据使我们可以选择使用管理模板。也就是说,我们可以定义一个管理模板,在组策略中使用它,并在网络范围内管理应用程序的配置。根据应用程序的性质,这可能是一大福音。
回答
在注册表中使用INI文件还有一个好处,我没有提到过:
如果用户使用某种基于卷/文件的加密,则他们可以很容易地获得INI文件的加密。使用注册表,可能会遇到更多问题。
回答
Jeff Atwood撰写了一篇很棒的文章,介绍了Windows的注册表,以及为什么最好使用.INI文件。
My life would be a heck of a lot easier if per-application settings were stored in a place I could easily see them, manipulate them, and back them up. Like, say... in INI files. The registry is a single point of failure. That's why every single registry editing tip you'll ever find starts with a big fat screaming disclaimer about how you can break your computer with regedit. The registry is opaque and binary. As much as I dislike the angle bracket tax, at least XML config files are reasonably human-readable, and they allow as many comments as you see fit. The registry has to be in sync with the filesystem. Delete an application without "uninstalling" it and you're left with stale registry cruft. Or if an app has a poorly written uninstaller. The filesystem is no longer the statement of record-- it has to be kept in sync with the registry somehow. It's a total violation of the DRY principle. The registry is monolithic. Let's say you wanted to move an application to a different path on your machine, or even to a different machine altogether. Good luck extracting the relevant settings for that one particular application from the giant registry tarball. A given application typically has dozens of settings strewn all over the registry.
回答
注册表针对快速访问和轻松更新进行了优化,这是完成某些特定于Windows的操作(例如与扩展名相关联)的唯一方法。而且,我们可以忽略有关删除单个目录以卸载程序的论点Windows Vista不允许我们修改Program Files目录中的文件,因此配置仍然需要放在其他文件夹中。
Windows编程有一个通用的指导方针,可以按照Microsoft期望的方式进行操作,生活会轻松很多。
就是说,我可以看到INI文件的吸引力,并且我不会怪任何人考虑它。
回答
在与应用程序相同的目录中使用ini文件,可以通过应用程序对其进行备份。因此,在重新加载操作系统之后,我们只需还原应用程序目录,即可按照所需的方式进行配置。