c#清除注册表文件.reg以删除重复项

c#清除注册表文件.reg以删除重复项,c#,registry,C#,Registry,我工作的一家公司有时会对他们的用户使用超级强制配置文件。不幸的是,这会导致很多问题,比如用户设置在注销时无法保存等等。为了解决这个问题,在启动时运行.reg文件。对于其中一些设置,regmon用于记录设置的更改,并由此创建一个reg文件。这样做的问题是他们有很多重复的条目,每次这样做都会使它越来越大顺便说一句,我没有实施这个过程,我只能接受它。 我将试图把它清理到最低限度,但我想知道是否有人这样做过。我的想法是,我将线读入2d数组,因此: [HKEY\U CURRENT\U USER\Softw

我工作的一家公司有时会对他们的用户使用超级强制配置文件。不幸的是,这会导致很多问题,比如用户设置在注销时无法保存等等。为了解决这个问题,在启动时运行.reg文件。对于其中一些设置,regmon用于记录设置的更改,并由此创建一个reg文件。这样做的问题是他们有很多重复的条目,每次这样做都会使它越来越大顺便说一句,我没有实施这个过程,我只能接受它。

我将试图把它清理到最低限度,但我想知道是否有人这样做过。我的想法是,我将线读入2d数组,因此:

[HKEY\U CURRENT\U USER\Software\CELCAT\CT\SAT\Settings]
“OpenTTVS”=“0”
“OTTFrmW”=“420”
“OTTFrmH”=“321”

变成:
[HKEY\U CURRENT\U USER\Software\CELCAT\CT\SAT\Settings],“OpenTTVS”=“0” [HKEY\U CURRENT\U USER\Software\CELCAT\CT\SAT\Settings],“OTTFrmW”=“420” [HKEY\U CURRENT\U USER\Software\CELCAT\CT\SAT\Settings],“OTTFrmH”=“321”

然后按相反的顺序删除重复项,这样,如果设置更改两次,它会首先删除文件中的条目

然后按配置单元对数组进行排序,并在每次更改时输出键和配置单元。如果术语有误,很抱歉


这样行吗?使用集合可能比使用数组更好,但你明白了。

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

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;
    }
}
字典设置
字典电流
对于源文件中的行{
if line.startswith(“[”){
if!regSettings.haskey(行){
添加(行,新字典())
}
当前=注册表设置[行]
}否则{
键,值=行。拆分(“”)
当前[键]=值;
}
}

有一些细节需要解释(空行、注释、记忆不好的函数名,应该根据C#…)进行调整),但这是基本思想。当您遇到重复设置时,后面的值将替换集合中较旧的值。要写入文件,只需输出reg头,然后迭代集合,写入顶级键名,后跟该键的所有值。

您可以使用字典字典。在伪代码中,然后,您可以这样做:

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;
    }
}
字典设置
字典电流
对于源文件中的行{
if line.startswith(“[”){
if!regSettings.haskey(行){
添加(行,新字典())
}
当前=注册表设置[行]
}否则{
键,值=行。拆分(“”)
当前[键]=值;
}
}

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

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

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

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


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

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

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

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


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

就像您的第二个想法非常好,它尝试了,而且效果很好。就像您的第二个想法非常好,它尝试了,并且效果很好。