首页 / 知识

关于Windows:用于存储用户可配置应用程序设置的注册表与INI文件

2023-04-11 22:33:00

关于Windows:用于存储用户可配置应用程序设置的注册表与INI文件

Registry vs. INI file for storing user configurable application settings

我是新来的Windows程序员,我不确定应该将用户可配置的应用程序设置存储在哪里。 我了解有必要为用户提供一种用户友好的方式来更改应用程序设置,例如"编辑" |"更改"。 设置形式或类似形式。 但是,在用户单击表单上的"应用"按钮之后,我应该将值存储在哪里?

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


配置文件的优点:

  • 容易做。不需要知道任何Windows API调用。您只需要知道您编程语言的文件I / O接口即可。
  • 随身携带。如果将应用程序移植到其他操作系统,则无需更改设置格式。
  • 用户可编辑。用户可以在程序执行之外编辑配置文件。
  • 注册表的优点:

  • 安全。除非他/她了解regedit,否则用户不能意外删除配置文件或破坏数据。然后用户只是自找麻烦。
  • 我不是Windows专家,但是我确信使用注册表使执行Windows特定的其他事情(用户特定的设置,网络管理之类的组策略之类的东西)更容易。
  • 如果您只需要一种简单的方法来存储配置信息,我建议您使用INI或XML作为格式的配置文件。我建议仅在您想摆脱使用注册表的某些特定条件时才使用注册表。


    杰夫·阿特伍德(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.


    在与应用程序相同的目录中使用ini文件,可以通过应用程序对其进行备份。因此,在重新加载操作系统之后,您只需还原应用程序目录,即可按照所需的方式进行配置。


    这里有一个类似的问题,涵盖了一些利弊。

    我建议不要使用注册表,除非您的应用程序绝对需要它。据我了解,由于设置文件的灵活性,Microsoft试图阻止使用注册表。另外,我不建议使用.ini文件,而是建议使用.Net的某些内置功能来保存用户/应用程序设置。


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

    但是,这样说来,如果您仍然想使用.ini文件,并使用标准配置文件API(GetPrivateProfileStringWritePrivateProfileString等)来访问它们,则它们提供了内置的方式来自动提供"虚拟.ini文件"。双赢!


    在注册表中使用INI文件还有另一个好处,我没有提到:
    如果用户使用某种基于卷/文件的加密,则他们可以很容易地获得INI文件的加密。使用注册表,可能会遇到更多问题。


    现有的答案涵盖了很多基础,但我想我还要提到另一点。

    我使用注册表存储系统范围的设置。即,当两个或更多程序需要完全相同的设置时。换句话说,一个设置由多个程序共享。

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

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

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

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

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


    正如Daniel所指出的,在注册表中存储配置数据使您可以选择使用管理模板。也就是说,您可以定义管理模板,在组策略中使用它,并在网络范围内管理应用程序的配置。根据应用程序的性质,这可能是一大福音。


    我同意丹尼尔。如果是大型应用程序,我想我会在注册表中执行操作。如果它是一个小型应用程序,并且您希望它的各个方面可以由用户配置而不需要填写配置表,请快速获取一个INI文件。

    我通常这样进行解析(如果.ini文件中的格式为option = value,每行1个,以#开头的注释):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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#中。


    注册表针对快速访问和轻松更新进行了优化,这是完成某些特定于Windows的事情(例如与扩展关联)的唯一方法。而且,您可以忽略有关删除单个目录以卸载程序的争论-Windows Vista不允许您修改Program Files目录中的文件,因此您的配置仍然需要放在其他文件夹中。

    Windows编程有一个通用指南-按照Microsoft期望的方式进行操作,您的生活会轻松很多。

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


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

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


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


    您的应用程序是随安装程序一起安装的,还是"提取并运行"的?在第一种情况下,请查看此处概述的利弊。但是对于提取和运行,我认为注册表是"不行的",因为人们希望能够简单地删除应用程序文件夹来摆脱程序。


    用户配置设置应用程序

    最新内容

    相关内容

    热门文章

    推荐文章

    标签云

    猜你喜欢