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

转载 2012年05月09日 14:25:12

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

.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

C#.NET对注册表的常用操作(增加项,判断指定项是否存在,增加键(键的名称,键的数值),判断指定的键是否存在)

建立一个对注册表的常用操作的工具类。在HKEY_LOCAL_MACHINE/SOFTWARE下,增加项,判断指定项是否存在,增加键(键的名称,键的数值),判断指定的键是否存在using System;...
  • aspnet2002web
  • aspnet2002web
  • 2011年05月14日 17:26
  • 4446

【C#】C#判断文件路径是否存在,不存在则创建文件夹

//判断文件路径是否存在,不存在则创建文件夹 if (!System.IO.Directory.Exists(@"D:\Export")) { System.IO.Directory.Creat...
  • ghxbob
  • ghxbob
  • 2014年03月29日 22:50
  • 4386

在Dos批处理中判断注册表项是否存在

代码如下:   @echo off set regpath="HKLM/SOFTWARE/Microsoft/MSBuild/3.5"REG QUERY %regpath% /s|find "HKEY...
  • lihongzhai
  • lihongzhai
  • 2009年04月23日 23:16
  • 4051

C#Winform判断文件和路径是否存在

//选择文件夹 FolderBrowserDialog dia = new FolderBrowserDialog(); if (dia.ShowDia...
  • pp_fzp
  • pp_fzp
  • 2016年05月17日 21:28
  • 1337

windows中判断注册表键值是否存在的一段函数

下面这个函数用于判断注册表键值是否存在 红色标记的是window APIbool IsRegValueExisted(HKEY hMainKey, LPCTSTR pSubKey, LPCTSTR p...
  • kingoverthecloud
  • kingoverthecloud
  • 2013年11月27日 13:04
  • 1120

C#控制台基础 判断dictionary中是否已经存在一个键

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 using System; using System.Collections; usin...
  • yushaopu
  • yushaopu
  • 2016年09月12日 21:01
  • 5604

判断注册表属性是否存在

判断注册表属性是否存在在《Windows PowerShell 3.0 First Steps》中,有一个判断注册表属性是否存在的示例,在 95-96 页。 假设有一个注册表 HKCU:\Softw...
  • hadstj
  • hadstj
  • 2016年04月13日 20:27
  • 816

C#判断网络地址 Url 是否存在的方法

临走时候(将近5:00),领导让弄一个东西,判断图片是否存在,如存在,调用小图,不存在调用大图。用下面的方法。轻松"搞定"......private bool UrlIsExist(String ur...
  • vincent_void
  • vincent_void
  • 2012年07月16日 17:28
  • 7366

C++判断用户输入路径是否正确(判断盘符是否存在以及“\”与"/")

直接上代码,用了windows.h里的函数获取盘符 #include #include #include #include #include using namespace std; st...
  • u012763043
  • u012763043
  • 2015年06月11日 12:57
  • 1235

c#创建xml读取xml方法并判断文件目录以及文件是否存在

public void cxml()         {             try             {                 string saveFileName =...
  • qiyunlei
  • qiyunlei
  • 2012年08月31日 16:24
  • 5236
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 操作注册表实例(包括判断路径是否存在)
举报原因:
原因补充:

(最多只允许输入30个字)