Windows注册表最佳实践

时间:2009-03-27 21:08:15

标签: windows registry

Windows注册表以何种方式使用?我知道存储少量用户偏好是可以的,但是将所有用户数据存储在那里被认为是不好的做法吗?我认为这将取决于数据集,那么对于少量数据,例如,小于2KB,在100个左右的不同键/值对中如何。这是不好的做法吗?平面文件或SQLite数据库是一种更好的做法吗?

8 个答案:

答案 0 :(得分:15)

我将采取逆势观点。

注册表是放置所有类型的配置数据的好地方。一般来说,它比大多数配置文件更快,更可靠(注册表上的各个操作都被处理,因此如果您的应用程序在写入过程中崩溃,注册表未被破坏 - 通常情况与ini文件不同)。

Marcelo MD完全正确:在注册表(或任何其他非易燃存储)中存储操作百分比完成等内容是一个可怕的想法。另一方面,存储像最近使用的文件这样的数据就好了 - 注册表是为这种问题而构建的。

此帖中谈论MRU列表的其他一些评论者已经讨论了当MRU列表因应用程序崩溃而不同步时会发生什么的问题。我想知道为什么将MRU列表存储在每个用户存储的平面文件中更好?

我也不确定将数据存储在注册表中的“安全隐患”是什么。注册表与文件系统一样安全 - 注册表和文件系统使用相同的ACL机制来保护其数据。

如果您要将用户数据存储在一个文件中,至少应该将数据放在%APPDATA%\ CompanyName \ ApplicationName中 - 这样两个不同的开发人员创建一个具有相同名称的应用程序(多少个“媒体管理器“应用程序在那里?”你不会有冲突。

答案 1 :(得分:11)

对我来说,简单的用户配置项和用户数据最好存储在简单的XML配置文件,SQLLite数据库或MS SQL Server Compact数据库中。确切的存储介质取决于实现的具体细节。

我只使用注册表来处理我不经常设置的内容,并且用户不需要能够更改/查看。例如,我之前已将加密的许可证信息存储在注册表中,以避免意外的用户删除数据。

答案 2 :(得分:7)

使用注册表存储数据主要有一个问题:它不是非常用户友好。用户几乎没有机会备份他们的设置,将它们复制到另一台计算机,如果它们被破坏就对它们进行故障排除(或重置它们),或者通常只是他们的软件在做什么。

我的经验法则是仅使用注册表与操作系统进行通信。文件类型关联,卸载程序条目,启动时运行的进程,显然必须在注册表中。

但是,在您的应用程序中使用的数据只属于App Data文件夹中的文件。 (无论如何,微软目前希望你使用的3个以上App Data文件夹中的一个)

答案 3 :(得分:5)

由于每个用户在Windows中都有专门用于存储应用程序用户数据的目录空间,因此我使用它来存储用户级数据(例如,首选项)。

在C#中,我会通过这样的方式得到它:

Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData);

通常,我会在那里存储SQLite文件或任何适合应用程序的文件。

答案 4 :(得分:4)

如果您的应用程序将“部署在企业中”,请记住管理员可以使用组策略工具调整注册表。例如,如果firefox使用注册表来代理代理服务器之类的东西,那么它会使部署变得轻而易举,因为管理员可以使用活动目录中的标准工具进行设置。如果你使用其他任何东西,我不认为这样的事情可以很容易地完成。

所以不要一起解雇注册表。如果管理员可能希望通过网络标准化部分配置,请将设置放在注册表中。

答案 5 :(得分:2)

我认为微软鼓励使用独立存储而不是Windows注册表。

Here's一篇解释如何在.Net中使用它的文章。

您可以在Windows XP下的Documents& amp;设置\\本地设置\应用程序数据\隔离存储。数据位于.dat文件

答案 6 :(得分:2)

我会区分:

一方面,应用程序运行所需的应用程序特定配置数据,例如要连接的IP地址,用于哪种文件等的文件夹,以及每个用户设置的非平凡。 那些我放入配置文件,ini格式的简单东西,xml,如果它变得更复杂。

另一方面,每个用户设置都很简单(最好的例子:窗口位置和布局)。为了避免混乱配置文件(一些用户想要自己编辑,所以很少和明确安排的条目是必须的),我喜欢把它们放在注册表中(如果注册表中没有设置,则在应用程序中设置保守的默认值可以找到)。

我主要像istmatt sais那样做:我将配置文件存储在%APPDATA%文件夹中。通常在%APPDATA%\ApplicationName中,我不喜欢.NET默认的APPDATA%\CompanyName\ApplicationName\Version,这种详细程度和复杂性对大多数中小型应用程序都适用。

我不同意Marcelo MD未在注册表中存储最近使用过的文件的示例。 IMO这正是可以存储在那里的易失性用户特定信息。 (他的例子要做的事情非常好!)

答案 7 :(得分:1)

对我来说,想想你不应该放在那里的东西似乎更容易。 例如:动态数据,例如编辑器的“最后打开的文件”和每个项目选项。当您的应用程序与注册表失去同步(文件删除,系统崩溃等)并检索无效的信息(可能使用户死锁)时,这真的很烦人。

在早期的工作中,我看到一个人在那里存储了数据传输完整性百分比,每10k左右写一个新值,并让GUI每秒检索一次这样的值,以便它可以显示在标题栏上。