2012-09-04 37 views
0

有人可以建議如何將註冊表中某個子類別的內容複製到另一個子類別的最佳方法嗎?在註冊表中複製子類別

例如,我們有:

HKEY_CURRENT_USER.Software.MyProgram.ver_1 

和運行功能檢查,如果沒有ver_2,所以創造... ... MyProgram.ver_2並複製那裏... MyProgram.ver_1的所有內容。

回答

0

This question回答了「如何讀/寫註冊表」的問題,並根據您可以這樣做:

  • 讀「ver_2」鍵
  • 如果「ver_2」不存在,創建它
  • 如果「ver_2」不存在上述,讀取在各值「ver_1」鍵和寫「ver_2」

基本上,讀取的值下使用相同的值,把它寫,然後讀另一,寫下來,等等。

4

一種擴展方法:

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); 
2

基於Wallys擴展方法我實現的MoveTo擴展方法。

此代碼還包含一個key.GetParent(...)擴展方法複製succeded後,將打開父鍵(必要的,因爲我用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); 
}