C#注册表情缘

记得当时刚接触C#的时候,喜欢编写各种小软件,而注册表系列和网络系列被当时的我认为大牛的必备技能。直到我研究注册表前一天我都感觉他是那么的高深。

今天正好有空,于是就研究了下注册表系列的操作,也随手封装了一个注册表帮助类。简单记一下,当饭后娱乐

完整Demo研究:https://github.com/dunitian/LoTCodeBase/tree/master/NetCode/0.知识拓展/02.注册表系

这个是一些常用的方法和属性(不全,只是列出了比较常用的一些)【OpenSubKey(string name,bool b)当b为true则表示开了可写权限】

//RegistryKey
//属性:
// ValueCount 检索项中值的计数
// SubKeyCount 获取子项个数
//方法:
// OpenSubKey(string name,bool b) 获取子项 RegistryKey,b为true时代表可写
// GetSubKeyNames() 获取所有子项名称的字符串数组
// GetValueNames() 检索包含与此项关联的所有值名称的字符串数组
// GetValue(string name) 获取指定名称,不存在名称/值对,则返回 null
// CreateSubKey(string subkey) 创建或者打开子项的名称或路径
// SetValue(string name,object value) 创建或者打开子项的名称或路径
// DeleteSubKeyTree(string subkey) 递归删除指定目录,不存在则抛异常
// DeleteSubKey(string subkey,bool b) 删除子项,b为false则当子项不存在时不抛异常
// DeleteValue(string name,bool b) 删除指定的键值,b为false则当子项不存在时不抛异常

先举个简单的案例:

代码如下:

            //获取一个表示HKLM键的RegistryKey
            RegistryKey rk = Registry.LocalMachine;
 
            //打开HKLM的子项Software
            RegistryKey subKey = rk.OpenSubKey(@"software");
 
            //遍历所有子项名称的字符串数组
            foreach (var item in subKey.GetSubKeyNames())
            {
                //以只读方式检索子项
                RegistryKey sonKey = subKey.OpenSubKey(item);
 
                rtxt.AppendText(string.Format("\n--->{0}<---\nSubKeyCount:{1} ValueCount:{2} FullName:{3}\n==================================\n", item, sonKey.SubKeyCount, sonKey.ValueCount, sonKey.Name));
 
                //检索包含与此项关联的所有值名称的字符串数组
                foreach (var name in sonKey.GetValueNames())
                {
                    rtxt.AppendText(string.Format("Name:{0} Value:{1} Type:{2}\n", name, sonKey.GetValue(name), sonKey.GetValueKind(name)));
                }
            }

做个综合的案例:

代码如下:

public partial class MainForm : Form
    {
        public RegistryKey Reg { get; set; }
        public MainForm()
        {
            InitializeComponent();
            //初始化
            var rootReg = Registry.LocalMachine;
            Reg = rootReg.OpenSubKey("software", true);//开权限
        }
 
        #region 公用方法
        /// <summary>
        /// 检验是否为空
        /// </summary>
        /// <param name="dntReg"></param>
        private bool KeyIsNull(RegistryKey dntReg)
        {
            if (dntReg == null)
            {
                rtxt.AppendText("注册表中没有dnt注册项\n");
                return true;
            }
            return false;
        }
 
        /// <summary>
        /// 遍历Key的Value
        /// </summary>
        /// <param name="reg"></param>
        private void ForeachRegKeys(RegistryKey reg)
        {
            rtxt.AppendText(string.Format("\n SubKeyCount:{0} ValueCount:{1} FullName:{2}\n", reg.SubKeyCount, reg.ValueCount, reg.Name));
            foreach (var name in reg.GetValueNames())
            {
                rtxt.AppendText(string.Format("Name:{0} Value:{1} Type:{2}\n", name, reg.GetValue(name), reg.GetValueKind(name)));
            }
        }
        #endregion
 
        //查
        private void btn1_Click(object sender, EventArgs e)
        {
            var dntReg = Reg.OpenSubKey("dnt");
            if (KeyIsNull(dntReg)) return;
            ForeachRegKeys(dntReg);
            foreach (var item in dntReg.GetSubKeyNames())
            {
                //以只读方式检索子项
                RegistryKey sonKey = dntReg.OpenSubKey(item);
                ForeachRegKeys(sonKey);
            }
        }
 
        //增
        private void btn2_Click(object sender, EventArgs e)
        {
            var dntReg = Reg.CreateSubKey("dnt");
            dntReg.SetValue("web", "http://www.dkill.net");
            var sonReg = dntReg.CreateSubKey("path");
            sonReg.SetValue("value", "D:\\Program Files\\dnt");
            rtxt.AppendText("添加成功\n");
        }
 
        //改
        private void btn3_Click(object sender, EventArgs e)
        {
            var dntReg = Reg.OpenSubKey("dnt", true);
            if (KeyIsNull(dntReg)) return;
            dntReg.SetValue("web", "http://dnt.dkill.net");
            rtxt.AppendText("修改成功\n");
        }
 
        //删
        private void btn4_Click(object sender, EventArgs e)
        {
            try
            {
                #region 删除某个值
                //var dntReg = Reg.OpenSubKey("dnt", true);
                //if (KeyIsNull(dntReg)) return;
                //dntReg.DeleteValue("web", false);
                #endregion
                Reg.DeleteSubKeyTree("dnt", false);
                rtxt.AppendText("删除成功\n");
            }
            catch (ArgumentException ex)
            {
                rtxt.AppendText(ex.ToString());
            }
        }
 
        private void clearlog_Click(object sender, EventArgs e)
        {
            rtxt.Clear();
        }
    }

Helper类综合实战:(有其他演示,有的电脑会出现权限问题)

using Microsoft.Win32;
using System.Collections.Generic;
 
public static partial class RegistryHelper
{
    #region 节点
    /// <summary>
    /// HKEY_LOCAL_MACHINE 节点
    /// </summary>
    public static RegistryKey RootReg = Registry.LocalMachine;
 
    /// <summary>
    /// HKEY_LOCAL_MACHINE 下 Software 节点
    /// </summary>
    public static RegistryKey SoftReg = Registry.LocalMachine.OpenSubKey("software", true);
 
    /// <summary>
    /// 包含有关当前用户首选项的信息。该字段读取 Windows 注册表基项 HKEY_CURRENT_USER
    /// </summary>
    public static RegistryKey CurrentUser = Registry.CurrentUser;
 
    /// <summary>
    /// HKEY_CURRENT_USER 下 Software 节点
    /// </summary>
    public static RegistryKey UserSoftReg = Registry.CurrentUser.OpenSubKey("software", true);
    #endregion
 
    #region 查询
    /// <summary>
    /// 根据名称查找Key,有则返回RegistryKey对象,没有则返回null
    /// </summary>
    /// <param name="name">要打开的子项的名称或路径</param>
    /// <param name="b">如果不需要写入权限请选择false</param>
    /// <returns></returns>
    public static RegistryKey FindKey(this RegistryKey reg, string name, bool b = true)
    {
        return reg.OpenSubKey(name, b);
    }
 
    /// <summary>
    /// 获取(name,value)字典,没有则返回null
    /// </summary>
    /// <param name="reg">当前RegistryKey</param>
    /// <returns></returns>
    public static IDictionary<string, object> GetKeyValueDic(this RegistryKey reg)
    {
        var dic = new Dictionary<string, object>();
        if (reg.ValueCount == 0) { return null; }
        ForeachRegKeys(reg, ref dic);
        return dic;
    }
 
    /// <summary>
    /// 获取子项(name,value)字典,没有则返回null
    /// </summary>
    /// <param name="reg">当前RegistryKey</param>
    /// <returns></returns>
    public static IDictionary<string, object> GetSubKeyValueDic(this RegistryKey reg)
    {
        var dic = new Dictionary<string, object>();
        if (reg.SubKeyCount == 0) { return null; }
        foreach (var item in reg.GetSubKeyNames())
        {
            //以只读方式检索子项
            var sonKey = reg.OpenSubKey(item);
            ForeachRegKeys(sonKey, ref dic);
        }
        return dic;
    }
 
    /// <summary>
    /// 遍历RegistryKey
    /// </summary>
    /// <param name="reg"></param>
    /// <param name="dic"></param>
    private static void ForeachRegKeys(RegistryKey reg, ref Dictionary<string, object> dic)
    {
        foreach (var name in reg.GetValueNames())
        {
            dic.Add(name, reg.GetValue(name));
        }
    }
    #endregion
 
    #region 添加
    /// <summary>
    /// 添加一个子项
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    public static RegistryKey AddSubItem(this RegistryKey reg, string name)
    {
        return reg.CreateSubKey(name);
    }
 
    /// <summary>
    /// 添加key-value,异常则RegistryKey对象返回null
    /// </summary>
    /// <param name="reg"></param>
    /// <param name="key"></param>
    /// <param name="value"></param>
    /// <returns></returns>
    public static RegistryKey AddKeyValue(this RegistryKey reg, string key, object value)
    {
        reg.SetValue(key, value);
        return reg;
    }
    #endregion
 
    #region 修改
    /// <summary>
    /// 修改key-value,异常则RegistryKey对象返回null
    /// </summary>
    /// <param name="reg"></param>
    /// <param name="key"></param>
    /// <param name="value"></param>
    /// <returns></returns>
    public static RegistryKey UpdateKeyValue(this RegistryKey reg, string key, object value)
    {
        return reg.AddKeyValue(key, value);
    }
    #endregion
 
    #region 删除
    /// <summary>
    /// 根据Key删除项
    /// </summary>
    /// <param name="reg"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public static RegistryKey DeleteKeyValue(this RegistryKey reg, string key)
    {
        reg.DeleteValue(key, false);
        return reg;
    }
 
    /// <summary>
    /// 删除子项所有内容
    /// </summary>
    /// <param name="reg"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public static RegistryKey ClearSubAll(this RegistryKey reg, string key)
    {
        reg.DeleteSubKeyTree(key, false);
        return reg;
    }
    #endregion
}

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-07-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Porschev[钟慰]的专栏

asp.net生成静态页

做个生成静态页示例: 采用替换模版页的形式生成静态页 第一步:新建项目,创建一个简单模版页:TemplatePage.htm <!DOCTYPE html PU...

2056
来自专栏程序员的SOD蜜

常见.NET功能代码汇总 (2)

常见.NET功能代码汇总 23,获取和设置分级缓存 获取缓存:首先从本地缓存获取,如果没有,再去读取分布式缓存 写缓存:同时写本地缓存和分布式缓存 priv...

2566
来自专栏码农阿宇

.Net Core中利用TPL(任务并行库)构建Pipeline处理Dataflow

在学习的过程中,看一些一线的技术文档很吃力,而且考虑到国内那些技术牛人英语都不差的,要向他们看齐,所以每天下班都在疯狂地背单词,博客有些日子没有更新了,见谅见谅...

2271
来自专栏linjinhe的专栏

LevelDB:使用介绍

Get 接口和 Put 接口比较像,除了 leveldb::ReadOptions 参数是用来控制读操作的,具体见链接指向的代码。

6665
来自专栏技术小讲堂

State模式的经典应用场景:订单处理(c#实现)场景描述遇到问题解决问题走起

State模式在对象内部状态发生变化的时候,改变自身的行为,这通常是通过切换内部状态对象实现的,对象将自身在各个状态的行为推给了状态对象,从而解开了行为与对象的...

2794
来自专栏技术小讲堂

ASP.NET Web API中的依赖注入什么是依赖注入ASP.NET Web API依赖解析器使用Unity解析依赖配置依赖解析

什么是依赖注入     依赖,就是一个对象需要的另一个对象,比如说,这是我们通常定义的一个用来处理数据访问的存储,让我们用一个例子来解释,首先,定义一个领域模型...

5208
来自专栏大内老A

ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II

二、ASP.NET Runtime Pipeline(续ASP.NET Http Runtime Pipeline - Part I) 现在我们真正进入ASP....

2048
来自专栏菩提树下的杨过

ExtJs学习笔记(23)-ScriptTagProxy+XTemplate+WCF跨域取数据

ajax应用中跨域一直是一个非常麻烦的问题,目前也有一些解决办法,但要么比较麻烦,要么就不具备通用性,幸好ExtJs里的ScriptTagProxy提供了跨域读...

2458
来自专栏Jackson0714

WCF传输1-你是否使用过压缩或Json序列化?

1494
来自专栏技术小讲堂

ASP.NET AJAX(4)__客户端访问WebService服务器端释放WebService方法客户端访问WebService客户端访问PageMethod错误处理复杂数据类型使用基础客户端代理的

服务器端释放WebService方法 编写一个普通的WebService 为WebService类添加自定义的属性标记__ScriptServiceAttrib...

2827

扫码关注云+社区

领取腾讯云代金券