我持有一种反其道而行之的观点。
注册表是放置各种配置数据的良好位置。通常来说,它比大多数配置文件更快,更可靠(在注册表上执行的单个操作是经过事务处理的,因此如果应用程序在写入时崩溃,注册表不会损坏——通常情况下 ini 文件不具备这种特性)。
Marcelo MD 是完全正确的:像操作完成百分比之类的东西存储在注册表中(或任何其他非易失性存储器中)都是一个可怕的想法。另一方面,像最近使用的文件之类的数据存储在其中则完全没有问题——注册表就是为解决此类问题而构建的。
本帖子中其他评论者中讨论 MRU 列表出现故障时会发生什么问题的人提到了一个问题。我想知道将 MRU 列表存储在每个用户存储中的平面文件中是否更好?
我也不确定将您的数据存储在注册表中的“安全影响”是什么。注册表与文件系统一样安全——注册表和文件系统使用相同的 ACL 机制来保护其数据。
如果您确实要将用户数据存储在文件中,至少应该将其放在%APPDATA%\公司名称\应用程序名称中,这样如果两个不同的开发人员创建一个具有相同名称的应用程序(有多少个“媒体管理器”应用程序存在?),您就不会遇到冲突。
对于我来说,简单的用户配置项和用户数据最好存储在一个简单的XML配置文件、SQLite数据库或MS SQL Server Compact数据库中。确切的存储介质取决于具体实现情况。
我只在需要很少设置并且用户不需要能够更改/查看的情况下使用注册表。例如,我曾经将加密许可证信息存储在注册表中以避免用户意外删除该数据。
由于每个用户在Windows中都有专门用于存储应用程序用户数据的目录空间,因此我使用它来存储用户级数据(例如首选项)。
在C#中,可以通过以下方式获取它:
Environment.GetFolderPath( Environment.SpecialFolder.ApplicationData);
%APPDATA%
文件夹中。通常在%APPDATA%\ApplicationName
中,我不喜欢.NET默认的APPDATA%\CompanyName\ApplicationName\Version
,对于大多数中小型应用程序来说,这种详细程度和复杂性是适得其反的。对我来说,更容易想到不应该放置哪些内容。 例如:动态数据,比如编辑器的“最近打开的文件”和每个项目的选项。当您的应用程序与注册表失去同步(文件删除、系统崩溃等)并检索不再有效的信息时,可能会使用户死锁,这真的很烦人。
在早期的工作中,我看到一个人将数据传输完成百分比存储在那里,每10k左右写入新值,并让GUI每秒检索此值,以便可以显示在标题栏上。