c#清理注册表文件.reg以删除重复的条目

时间:2009-07-24 11:24:13

标签: c# registry

我工作的公司有时会为其用户使用超级强制配置文件。不幸的是,这会导致很多问题,用户设置不会在注销时保存等等。要解决此问题,请在启动时运行.reg文件。对于其中一些设置,regmon用于记录进行设置更改以及从此创建的reg文件。这样做的问题在于它们有很多重复的条目,每次完成它都会越来越大。 顺便说一下,我没有实施这个程序,我只需忍受它。

我打算将其清理到最低限度,但我想知道是否有人之前做过这件事。我在想的是,我把这些行读成了一个二维数组,所以:

[HKEY_CURRENT_USER \ SOFTWARE \ CELCAT \ CT \ SAT \设置]
“OpenTTVS”= “0”
“OTTFrmW”= “420”
“OTTFrmH”= “321”

变为:
[HKEY_CURRENT_USER \ Software \ CELCAT \ CT \ SAT \ Settings],“OpenTTVS”=“0” [HKEY_CURRENT_USER \ Software \ CELCAT \ CT \ SAT \ Settings],“OTTFrmW”=“420” [HKEY_CURRENT_USER \ Software \ CELCAT \ CT \ SAT \ Settings],“OTTFrmH”=“321”

然后以相反的顺序删除重复项,因此如果设置更改两次,则会先删除文件中的条目。

然后通过配置单元对数组进行排序,并在每次输出密钥时输出密钥。对不起,如果术语有误。

这会有用吗?可能更好地使用集合而不是数组,但你明白了。

2 个答案:

答案 0 :(得分:2)

您可以使用词典词典。在伪代码中,您可以执行以下操作:

Dictionary<String, Dictionary<String, String>> regSettings
Dictionary<String, String> current
for line in sourcefile {
    if line.startswith("[") {
        if !regSettings.haskey(line) {
            regSettings.add(line, new Dictionary<String, String>() )
        }
        current = regSettings[line]
    } else {
        key, value = line.split("=")
        current[key] = value;
    }
}

有一些细节要考虑(空白行,注释,记忆不佳的函数名称应该为C#调整......),但这是基本的想法。当您遇到重复设置时,后面的值将替换集合中较旧的值。要编写文件,只需输出reg标头,然后迭代集合,编写顶级密钥名称,然后是该密钥的所有值。

答案 1 :(得分:2)

第一次尝试我会将这个.reg文件读入树中,就像regedit的样子一样。通过构建树,您只需检查节点是否存在。如果没有,则创建它否则覆盖现有值。

因此,您将获得生效的最后一个条目。创建此树后,您必须回读当前树,然后就可以了。

写这篇文章时,我会有另一个想法: 在texteditor中打开.reg文件。将“[HKEY_CURRENT_USER”替换为“[HKEY_CURRENT_USER \ JustSomeKeyThatDoesNotExists”并将此文件导入注册表。现在打开注册表并将整个“[HKEY_CURRENT_USER \ JustSomeKeyThatDoesNotExists”]导回到文件中。打开文件并向后进行第一次替换。

现在,您将按排序顺序拥有一个具有唯一值的文件。 ; - ))

相关问题