C# 操作注册表实例(包括判断路径是否存在)

在应用程序安装时, 常常需要利用注册表来登记应用程序的名称 、运行路径、 用户对应用程序的配置信息等 。许多应用程序在运行时也常常需要访问注册表。

.Net 框架结构在 Microsoft.Win32 名字空间内提供了两个类用于注册表操作:Registry 和RegistryKey 。这两个类都是密封类, 不允许被其它类继承。

Registry 类中提供了 7 个公有的静态域 ,分别代表 Windows 注册表中的 7 个基本主键 。它们是:
 

Registry.ClassesRoot  对应于 HKEY_CLASSES_ROOT 主键。
Registry.CurrentUser  对应于 HKEY_CURRENT_USER 主键。
Registry.LocalMachine  对应于 HKEY_ LOCAL_MACHINE 主键。
Registry.Users  对应于 HKEY_USERS 主键。
Registry.CurrentConfig  对应于 HKEY_CURRENT_CONFIG 主键
Registry.DynDta  对应于 HKEY_DYN_DATA 主键
Registry.PerformanceData  对应于 HKEY_ PERFORMANCE_DATA 主键

RegistryKey类中封装了对 Windows 注册表的基本操作。 对注册表的操作必须符合系统提供的权限 ,否则不能完成指定的操作, 程序将抛出一个异常。


创建子键
创建子键的成员方法的原型为:
 

C#代码
public RegistryKey CreateSubKey(string subkey);  

其中 ,参数 subkey 表示要创建的子键的名字或子键的全路径名 。如果创建成功,返回值就是被创建的子键 ,否则为null。

打开子键
打开子键的成员方法原型为:
 

C#代码
public RegistryKey OpenSubKey(string name);   
public RegistryKey OpenSubKey(string name, bool writable);  

name 参数表示要打开的子键名称或全路径名 ,writable 参数表示被打开的主键是否可以被修改。第一个方法对打开的子键默认是只读的, 如果希望对打开的主键进行写操作 ,使用第二个方法 并把writable参数值设为true。命名空间 Microsoft.Win32 中还为我们提供了另一个方法 ,用于打开远程机器上的注册表进行操作 。方法原型为:
 

C++代码
public static RegistryKey OpenRemoteBaseKey( RegistryHive hKey, string machineName);  


删除子键

DeleteSubKey方法用于删除指定的子键 ,方法原型为:
 

C#代码
public void DeleteSubKey (string subkey);  


使用 DeleteSubKey 方法时,如果子键之中还包含子键 ,则删除失败 ,并返回一个异常。 如果要彻底删除子键目录,即删除子键以及子键以下的全部子键,可以使用DeleteSubKeyTree方法 。该方法原型为:
 

C#代码
public void DeleteSubKeyTree(string subkey);  


读取键值

读键的方法原型为:
 

C#代码
public object GetValue(string name);   
public object GetValue(string name, object defaultValue);  

name 参数表示键的名称, 返回类型是一个 object 类型。 如果方法中指定的键不存在 ,则方法返回一个 null。 我们在使用 GetValue 方法时, 可以不必关心该键的值类型究竟是字符串 、二进制还是DWORD类型, 只要使用正确的返回类型就可以了。 比如,我们希望读取一个字符串类型的键值, 代码就可以这样写:
 

C#代码
string s_value = key.GetValue(“Type”);  


其中key表示一个主键。如果不确定键值是否存在 ,而又不希望得到一个 null 返回值, 那就使用第二个方法GetValue(string name, object defaultValue), 其中的参数defaultValue表示默认的返回值 。如果读取失败, 返回值就是传递给参数defaultValue的值。


设置键值
设置键值的方法原型为:
 

C#代码
public void SetValue(string name, object value);  


同样 ,我们在使用该方法修改键值时,不用费心去分辨究竟该传递哪种值类型,方法将会识别是哪种类型, 并把相应类型的值赋予指定的键。

1.读取指定名称的注册表的值

C#代码
private string GetRegistData(string name)   
  
{   
  
   string registData;   
  
   RegistryKey hkml = Registry.LocalMachine;   
  
   RegistryKey software = hkml.OpenSubKey("SOFTWARE",true);   
  
   RegistryKey aimdir = software.OpenSubKey("XXX",true);   
  
   registData = aimdir.GetValue(name).ToString();   
  
   return registData;   
  
}   

 

以上是读取的注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下的XXX目录中名称为name的注册表值;

2.向注册表中写数据

C#代码
private void WTRegedit(string name,string tovalue)   
  
{   
  
   RegistryKey hklm = Registry.LocalMachine;   
  
   RegistryKey software = hklm.OpenSubKey("SOFTWARE",true);   
  
   RegistryKey aimdir = software.CreateSubKey("XXX");   
  
   aimdir.SetValue(name,tovalue);   
  
}   

 

以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下新建XXX目录并在此目录下创建名称为name值为tovalue的注册表项;

3.删除注册表中指定的注册表项

C#代码
private void DeleteRegist(string name)   
  
{   
  
   string[] aimnames;   
  
   RegistryKey hkml = Registry.LocalMachine;   
  
   RegistryKey software = hkml.OpenSubKey("SOFTWARE",true);   
  
   RegistryKey aimdir = software.OpenSubKey("XXX",true);   
  
   aimnames = aimdir.GetSubKeyNames();   
  
   foreach(string aimKey in aimnames)   
  
   {   
  
    if(aimKey == name)   
  
     aimdir.DeleteSubKeyTree(name);   
  
   }   
  
}   

 

以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下XXX目录中删除名称为name注册表项;

4.判断指定注册表项是否存在

 

C#代码
private bool IsRegeditExit(string name)   
  
        {   
  
            bool _exit = false;   
  
            try  
  
            {   
  
                string[] subkeyNames;   
  
                RegistryKey hkml = Registry.LocalMachine;   
  
                RegistryKey software = hkml.OpenSubKey("SOFTWARE", true);        
                RegistryKey aimdir = software.OpenSubKey("Weather", true);               /由此可判断Weather路径是否存在

   
                subkeyNames = aimdir.GetValueNames();   
  
                foreach (string keyName in subkeyNames)   
  
                {   
  
                    if (keyName == name)   
  
                    {   
  
                        _exit = true;   
  
                        return _exit;   
  
                    }   
  
                }   
  
            }   
  
            catch  
  
            { }   
  
            return _exit;   
  
        }   

以上是在注册表中HKEY_LOCAL_MACHINE\SOFTWARE目录下XXX目录中判断名称为name注册表项是否存在,这一方法在删除注册表时已经存在,在新建一注册表项时也应有相应判断;

一个例子:

C#代码
using Microsoft.Win32;   
  
    using System.Diagnostics;   
  
    private void Access_Registry()   
  
    {   
  
         // 在HKEY_LOCAL_MACHINE\Software下建立一新键,起名为MCBInc   
  
            RegistryKey key = Registry.LocalMachine.OpenSubKey("Software", true);   
  
         // 增加一个子键   
  
            RegistryKey newkey = key.CreateSubKey("MCBInc");   
  
     
  
 // 设置此子键的值   
  
            newkey.SetValue("MCBInc", "NET Developer");   
  
           
  
// 从注册表的其他地方获取数据   
  
           
  
// 找出你的CPU   
  
            RegistryKey pRegKey = Registry.LocalMachine;   
  
            pRegKey = pRegKey.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");   
  
            Object val = pRegKey.GetValue("VendorIdentifier");   
  
            Debug.WriteLine("The central processor of this machine is:"+ val);   
  
         // 删除键值   
  
            RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software", true);   
  
            delKey.DeleteSubKey("MCBInc");   
  
    }   

 以上内容转摘自(CNode.CN)详细出处请参考:http://www.cnode.cn/article.asp?id=308

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值