• 弥补学生时代的遗憾~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("
    --->{0}<---
    SubKeyCount:{1} ValueCount:{2} FullName:{3}
    ==================================
    ", item, sonKey.SubKeyCount, sonKey.ValueCount, sonKey.Name));
    
                    //检索包含与此项关联的所有值名称的字符串数组
                    foreach (var name in sonKey.GetValueNames())
                    {
                        rtxt.AppendText(string.Format("Name:{0} Value:{1} Type:{2}
    ", 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注册项
    ");
                    return true;
                }
                return false;
            }
    
            /// <summary>
            /// 遍历Key的Value
            /// </summary>
            /// <param name="reg"></param>
            private void ForeachRegKeys(RegistryKey reg)
            {
                rtxt.AppendText(string.Format("
     SubKeyCount:{0} ValueCount:{1} FullName:{2}
    ", reg.SubKeyCount, reg.ValueCount, reg.Name));
                foreach (var name in reg.GetValueNames())
                {
                    rtxt.AppendText(string.Format("Name:{0} Value:{1} Type:{2}
    ", 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("添加成功
    ");
            }
    
            //改
            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("修改成功
    ");
            }
    
            //删
            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("删除成功
    ");
                }
                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
    }
  • 相关阅读:
    Navicat for MySQL下载、安装与破解
    javaweb之Cookie学习
    static特别用法【静态导包】——Java包的静态导入
    面试感悟----一名3年工作经验的程序员应该具备的技能
    致孩子
    java中的代码块是什么意思,怎么用
    ModelAttribute用法之一
    SpringMVC获取页面数据乱码的解决get/post
    总结过去10年的程序员生涯 (经验)---大神的建议
    hdu 5237 二进制
  • 原文地址:https://www.cnblogs.com/dunitian/p/5634106.html
Copyright © 2020-2023  润新知