C# 注册表帮助类

转载:https://github.com/TKT2016/WmnSharpCodes/blob/master/WmnSharpStdCodes/Windows/SharpRegistry.cs

/**
    2019-12-04:
    卓语言:中文编程,世界第一个非名参式编程语言
    网址:www.zyuyan.org
*/
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;

namespace WmnSharpStdCodes.Windows
{
    /// <summary>
    /// 操作windows注册表,支持32位和64位
    /// 版本:1.0,2019-12-04 09:17:15
    /// </summary>
    public class SharpRegistry
    {
        public RegistryKey RootRegistry { get; private set; }
        public RegistryKey CurrentRegistry { get; private set; }
        public string RootKeyName{ get; private set; }
        public string CurrentKeyName { get; private set; }

        public SharpRegistry(string fullKey)
        {
            if(string.IsNullOrWhiteSpace(fullKey))
            {
                throw new Exception("注册表项错误");
            }
            RootRegistry = GetRoot(fullKey);
            if(RootRegistry==null)
            {
                throw new Exception("注册表项错误");
            }
            RootKeyName = GetRootName(fullKey);
            CurrentKeyName = fullKey.Substring(RootKeyName.Length);
            Open();
        }

        public bool Exists
        {
            get
            {
                return CurrentRegistry != null;
            }
        }

        public void Create()
        {
            if (Exists) return;
            CurrentRegistry = RootRegistry.CreateSubKey(CurrentKeyName);
        }

        public void Delete()
        {
            Open();
            if (!Exists) return;
            RootRegistry.DeleteSubKey(CurrentKeyName, true);
            CurrentRegistry = null;
            Close();
        }

        private bool IsClose = false;

        internal void Open()
        {
            if (CurrentRegistry == null)
            {
                CurrentRegistry = RootRegistry.OpenSubKey(CurrentKeyName, true);
            }
            else if(IsClose)
            {
                CurrentRegistry = RootRegistry.OpenSubKey(CurrentKeyName, true);
            }
            IsClose = false;
        }

        public void Close()
        {
            if (CurrentRegistry != null)
            {
                CurrentRegistry.Close();
            }
            IsClose = true;
        }

        #region 注册表键值操作

        public object ReadDefault()
        {
            return ReadSub("");
        }

        public void WriteDefault(object value)
        {
            WriteSub("",value);
        }

        public object ReadSub(string item)
        {
            Open();
            object obj = CurrentRegistry.GetValue(item);
            return obj;
        }

        public void WriteSub(string item,object value)
        {
            Open();
            CurrentRegistry.SetValue(item, value);
            Close();
        }

        public void DeleteSub(string subName)
        {
            Open();
            CurrentRegistry.DeleteValue(subName);
            Close();
        }

        public bool ExistsSub(string subName)
        {
            Open();
            string[] subNames = GetSubItemNames();
            if (subNames == null) return false;
            if (subNames.Length == 0) return false;
            foreach (string keyName in subNames)
            {
                if (keyName == subName) 
                {
                    return true;
                }
            }
            return false;
        }

        public string[] GetSubItemNames()
        {
            Open();
            if (!Exists) return null;
            return CurrentRegistry.GetSubKeyNames();
        }

        #endregion

        public static RegistryKey GetRoot(string subKey)
        {
            if (string.IsNullOrWhiteSpace(subKey))
            {
                throw new ArgumentNullException("参数subKey不能为空");
            }
            string rootKeyName = subKey.ToUpper(CultureInfo.InvariantCulture);
            RegistryView registryView = RegistryView.Default;
            /* 必须区分64位和32位 */
            if(Environment.Is64BitOperatingSystem)
            {
                registryView = RegistryView.Registry64;
            }

            if (rootKeyName.StartsWith("HKEY_CLASSES_ROOT\\", StringComparison.OrdinalIgnoreCase))
            {
                return RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, registryView);
            }
            else if (rootKeyName.StartsWith("HKEY_CURRENT_USER\\", StringComparison.OrdinalIgnoreCase))
            {
                return RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, registryView);
            }
            else if (rootKeyName.StartsWith("HKEY_LOCAL_MACHINE\\", StringComparison.OrdinalIgnoreCase))
            {
                return RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView);
            }
            else if (rootKeyName.StartsWith("HKEY_USERS\\", StringComparison.OrdinalIgnoreCase))
            {
                return RegistryKey.OpenBaseKey(RegistryHive.Users, registryView);
            }
            else if (rootKeyName.StartsWith("HKEY_CURRENT_CONFIG\\", StringComparison.OrdinalIgnoreCase))
            {
                return RegistryKey.OpenBaseKey(RegistryHive.CurrentConfig, registryView);
            }
            else
            {
                //throw new Exception("注册表根目录不存在");
            }
            return null;
        }

        public static string GetRootName(string subKey)
        {
            if(string.IsNullOrWhiteSpace(subKey))
            {
                throw new ArgumentNullException("参数subKey不能为空");
            }
            string rootKeyName = subKey.ToUpper(CultureInfo.InvariantCulture);
            if (rootKeyName.StartsWith("HKEY_CLASSES_ROOT\\", StringComparison.OrdinalIgnoreCase))
            {
                return "HKEY_CLASSES_ROOT\\";
            }
            else if (rootKeyName.StartsWith("HKEY_CURRENT_USER\\", StringComparison.OrdinalIgnoreCase))
            {
                return "HKEY_CURRENT_USER\\";
            }
            else if (rootKeyName.StartsWith("HKEY_LOCAL_MACHINE\\", StringComparison.OrdinalIgnoreCase))
            {
                return "HKEY_LOCAL_MACHINE\\";
            }
            else if (rootKeyName.StartsWith("HKEY_USERS\\", StringComparison.OrdinalIgnoreCase))
            {
                return "HKEY_USERS\\";
            }
            else if (rootKeyName.StartsWith("HKEY_CURRENT_CONFIG\\", StringComparison.OrdinalIgnoreCase))
            {
                return "HKEY_CURRENT_CONFIG\\";
            }
            else
            {
                //throw new Exception("注册表根目录不存在");
            }
            return null;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值