Registry vs. INI文件,用于存储用户可配置的应用程序设置

时间:2008-08-09 04:13:03

标签: windows registry settings configuration-files ini

我是一名新的Windows程序员,我不确定应该在哪里存储用户可配置的应用程序设置。我理解需要为用户提供用户友好的方法来更改应用程序设置,例如编辑|设置表单或类似。但是,在用户点击该表单上的“应用”按钮后,我应该在哪里存储值?

在Windows注册表中存储设置与将其存储在本地INI文件或配置文件或类似文件中的优缺点是什么?

14 个答案:

答案 0 :(得分:38)

配置文件的优点:

  1. 容易做到。不需要知道任何Windows API调用。您只需要知道编程语言的文件I / O接口。
  2. 便携式。如果将应用程序移植到另一个操作系统,则无需更改设置格式。
  3. 用户可编辑的。用户可以在执行程序之外编辑配置文件。
  4. 注册管理机构的优点:

    1. 安全。除非他/她知道regedit,否则用户不会意外删除配置文件或破坏数据。然后用户只是在寻找麻烦。
    2. 我不是Windows程序员的专家,但我确信使用注册表可以更容易地执行其他Windows特定的操作(用户特定设置,网络管理等组策略或其他任何内容)。
    3. 如果您只需要一种简单的方法来存储配置信息,我建议使用INI或XML作为格式的配置文件。我建议只有在你想要使用注册表时才能使用注册表。

答案 1 :(得分:24)

杰夫阿特伍德有一个很棒的article关于Windows的注册表,为什么更好地使用.INI文件。

  

如果将每个应用程序设置存储在一个我可以轻松看到它们,操纵它们并备份它们的地方,那么我的生活将变得更容易。比如,说...在INI文件中。

     
      
  • 注册表是单点故障。这就是为什么你能找到的每一个注册表编辑提示开头都有一个很大的尖叫免责声明,关于你如何用注册表破坏你的计算机。
  •   
  • 注册表是不透明和二进制。尽管我不喜欢角括号税,但至少XML配置文件是人类可读的,它们允许你认为合适的评论。
  •   
  • 注册表必须与文件系统同步。删除一个没有“卸载”它的应用程序,你就会留下陈旧的注册表。或者,如果某个应用程序的卸载程序写得不好。文件系统不再是记录语句 - 它必须以某种方式与注册表保持同步。这完全违反了DRY原则。
  •   
  • 注册表是单片。假设您希望将应用程序移动到计算机上的其他路径,甚至将其移动到另一台计算机上。祝您从巨大的注册表tarball中提取该特定应用程序的相关设置。给定的应用程序通常有遍布注册表的数十个设置。
  •   

答案 2 :(得分:4)

根据GetPrivateProfileString的文档,您应该使用注册表来存储初始化信息。

但是,如果你仍然想要使用.ini文件,并使用标准的配置文件API(GetPrivateProfileStringWritePrivateProfileString等)来访问它们,它们提供了内置的以自动提供注册表支持的“虚拟.ini文件”的方式。双赢!

答案 3 :(得分:4)

有一个类似的问题here涵盖了一些优点和缺点。

我建议不要使用注册表,除非你的应用程序绝对需要它。根据我的理解,由于设置文件的灵活性,Microsoft正试图阻止使用注册表。此外,我不建议使用.ini文件,而是使用一些built-in functionality到.Net来保存用户/应用程序设置。

答案 4 :(得分:4)

在与应用程序相同的目录中使用ini文件,可以使用该应用程序对其进行备份。因此,在重新加载操作系统之后,只需恢复应用程序目录,就可以按照自己的方式进行配置。

答案 5 :(得分:3)

在注册表中使用INI文件还有一个优点,我还没有提到: 如果用户使用某种基于卷/文件的加密,他们可以非常容易地加密INI文件。使用注册表可能会有更多问题。

答案 6 :(得分:2)

我同意丹尼尔。如果它是一个大型应用程序,我想我会在注册表中做一些事情。如果它是一个小应用程序,并且您希望用户可配置的方面而不需要配置表单,请转到快速的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#中。

答案 7 :(得分:2)

正如Daniel指出的那样,在配置文件中存储配置数据可让您选择使用管理模板。也就是说,您可以定义管理模板,在组策略中使用它并在网络范围内管理应用程序的配置。根据应用程序的性质,这可能是一个很大的好处。

答案 8 :(得分:1)

注册表已针对快速访问和轻松更新进行了优化,并且它是执行特定Windows特定事务(如与扩展程序关联)的唯一方法。并且您可以忽略关于删除单个目录以卸载程序的争论 - Windows Vista将不允许您修改Program Files目录中的文件,因此您的配置无论如何都需要进入不同的文件夹。

Windows编程的一般准则 - 按照Microsoft期望的方式做事,并且您的生活将变得更加轻松。

那就是说,我可以看到INI文件的吸引力,我不会责怪任何人考虑它。

答案 9 :(得分:1)

现有的答案涵盖了很多方面,但我想我会提到另外一点。

我使用注册表来存储系统范围的设置。也就是说,当2个或更多程序需要完全相同的设置时。换句话说,几个程序共享的设置。

在所有其他情况下,我使用本地配置文件,该文件位于与可执行文件相同的路径中,或者位于一个级别(在Configuration目录中)。原因已在其他答案中介绍(便携式,可以使用文本编辑器等进行编辑)。

为什么要将系统范围的设置放入注册表?好吧,我发现如果共享一个设置但你使用本地配置文件,你最终会复制设置。这可能意味着您最终需要在多个位置更改设置。

例如,假设程序A和程序B都指向同一个数据库。您可以为连接字符串设置“系统范围”的注册表设置。如果要指向其他数据库,可以在一个位置更改连接字符串,现在这两个程序将针对另一个数据库运行。

注意 - 如果两个或多个程序不需要使用相同的值,则以这种方式使用注册表是没有意义的。例如,程序A和程序B都需要 可能 的数据库连接字符串相同,但并非总是如此。例如,我希望程序B现在使用测试数据库,但程序A应该继续使用生产数据库。

通过上面的示例,您可以使用一些本地配置覆盖系统范围的设置,但对于简单的任务,它可能会变得过于复杂。

答案 10 :(得分:0)

使用注册表的另一个缺点是,如果您在32位和64位应用程序的混合环境中工作,这会很痛苦,因为访问注册表的系统调用将随机(*)将\Wow6432Node\添加到您的注册表路径中,使您在调试时发疯。

(*当然不是随机的,但很容易迷路)

答案 11 :(得分:0)

优点:

  • 替换大量配置文件。
  • 集中管理公共职能。
  • 应用程序/驱动程序几乎可以保存任何数据。
  • 与配置文件相比,甚至可以保存代码序列。
  • 访问速度比文件快,因为数据库已编入索引。
  • 可以使用 RegMon 实用程序记录访问

缺点:

  • 在没有图形配置程序的情况下难以使用。
  • 使用注册表编辑器进行直接更改可能会产生不一致的状态。
  • 不完整的卸载程序会在注册表中留下“回忆” 导致问题,例如新安装。
  • 已安装的应用程序很难导出到其他 PC。
  • 长期记录不完整。
  • 专有结构,因此不适合标准数据库访问(例如 SQL)
  • 特定于计算机,因此不可移植到其他计算机。
  • 注册表保护不足:取决于配置。

答案 12 :(得分:-1)

ini或配置文件存在一个缺点,即如果用户可以选择安装程序的位置,则会找到它们。

答案 13 :(得分:-2)

您的应用程序是否随安装程序一起安装,或者只是“提取并运行”?在第一种情况下,请查看此处概述的优缺点。但对于Extract和run,在我看来,注册表是一个“禁止”,因为人们希望能够简单地删除应用程序文件夹以摆脱你的程序。