1

有人可以建议如何将注册表中一个子类别的内容复制到另一个子类别的最佳方法吗?

例如我们有:

HKEY_CURRENT_USER.Software.MyProgram.ver_1 

并运行函数检查,如果没有 ver_2,则创建 ...MyProgram.ver_2 并在那里复制 ...MyProgram.ver_1 的所有内容。

4

3 回答 3

7

扩展方法:

public static void CopyTo(this RegistryKey src, RegistryKey dst)
{
    // copy the values
    foreach (var name in src.GetValueNames())
    {
        dst.SetValue(name, src.GetValue(name), src.GetValueKind(name));
    }

    // copy the subkeys
    foreach (var name in src.GetSubKeyNames())
    {
        using (var srcSubKey = src.OpenSubKey(name, false))
        {
            var dstSubKey = dst.CreateSubKey(name);
            srcSubKey.CopyTo(dstSubKey);
        }
    }
}

像这样调用:

var ver1 = Registry.CurrentUser.OpenSubKey(@"Software\MyProgram\ver_1");
var ver2 = Registry.CurrentUser.OpenSubKey(@"Software\MyProgram\ver_2");
ver1.CopyTo(ver2);
于 2013-09-12T18:47:50.963 回答
2

基于 Wallys 扩展方法,我实现了一个MoveTo扩展方法。

此代码还包含一个key.GetParent(...)扩展方法,它将打开父密钥(需要,因为我使用DeleteSubKeyTree方法在复制成功后删除密钥。

public static void MoveTo(this RegistryKey src, RegistryKey dst)
{
    src.CopyTo(dst);
    src.Delete();
}

public static void Delete(this RegistryKey key)
{
    using (var parentKey = key.GetParent(true))
    {
        var keyName = key.Name.Split('\\').Last();
        parentKey.DeleteSubKeyTree(keyName);
    }
}

public static RegistryKey GetParent(this RegistryKey key)
{
    return key.GetParent(false);
}

public static RegistryKey GetParent(this RegistryKey key, bool writable)
{
    var items = key.Name.Split('\\');
    var hiveName = items.First();
    var parentKeyName = String.Join("\\", items.Skip(1).Reverse().Skip(1).Reverse());

    var hive = GetHive(hiveName);
    using (var baseKey = RegistryKey.OpenBaseKey(hive, key.View))
    {
        return baseKey.OpenSubKey(parentKeyName, writable);
    }
}

private static RegistryHive GetHive(string hiveName)
{
    if (hiveName.Equals("HKEY_CLASSES_ROOT", StringComparison.OrdinalIgnoreCase))
        return RegistryHive.ClassesRoot;
    else if (hiveName.Equals("HKEY_CURRENT_USER", StringComparison.OrdinalIgnoreCase))
        return RegistryHive.CurrentUser;
    else if (hiveName.Equals("HKEY_LOCAL_MACHINE", StringComparison.OrdinalIgnoreCase))
        return RegistryHive.LocalMachine;
    else if (hiveName.Equals("HKEY_USERS", StringComparison.OrdinalIgnoreCase))
        return RegistryHive.Users;
    else if (hiveName.Equals("HKEY_PERFORMANCE_DATA", StringComparison.OrdinalIgnoreCase))
        return RegistryHive.PerformanceData;
    else if (hiveName.Equals("HKEY_CURRENT_CONFIG", StringComparison.OrdinalIgnoreCase))
        return RegistryHive.CurrentConfig;
    else if (hiveName.Equals("HKEY_DYN_DATA", StringComparison.OrdinalIgnoreCase))
        return RegistryHive.DynData;
    else
        throw new NotImplementedException(hiveName);
}
于 2017-06-22T08:06:09.817 回答
0

这个问题回答了“如何读/写注册表”的问题,基于此,您可以这样做:

  • 读取“ver_2”键
  • 如果“ver_2”不存在,则创建它
  • 如果上面不存在“ver_2”,则读取“ver_1”键中的每个值并在“ver_2”下写入相同的值

基本上,您读取一个值,写入它,然后读取另一个值,写入它,等等。

于 2012-09-04T11:40:12.553 回答