天天看点

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

继续阅读