有人可以建议如何将注册表中一个子类别的内容复制到另一个子类别的最佳方法吗?
例如我们有:
HKEY_CURRENT_USER.Software.MyProgram.ver_1
并运行函数检查,如果没有 ver_2,则创建 ...MyProgram.ver_2 并在那里复制 ...MyProgram.ver_1 的所有内容。
扩展方法:
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);
基于 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);
}
这个问题回答了“如何读/写注册表”的问题,基于此,您可以这样做:
基本上,您读取一个值,写入它,然后读取另一个值,写入它,等等。