C#如何校验、读写、删除可能不存在的注册表项
解决方案
.NET 类库本身已经提供了内置能力可以直接满足需求,不需要自行实现路径拆分、逐层创建逻辑:
RegistryKey.CreateSubKey()方法会自动创建路径中所有不存在的层级子项,如果目标路径已存在则直接返回可写的子项实例OpenSubKey()方法在目标路径不存在时会返回null,做好空判断即可避免异常- 操作键值时使用带默认值的重载可以避免键不存在抛出的异常
修改后的完整实现代码
using Microsoft.Win32; // 注册表路径统一提为常量避免重复书写 private const string TargetRegPath = @"Software\Microsoft\Windows\Shell\Bags\AllFolders\Shell\{885A186E-A440-4ADA-812B-DB871B942259}"; internal bool DownloadGroupByOff() { using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) { using (var explore = hklm.OpenSubKey(TargetRegPath)) { // 路径不存在 或 键不存在/值不等于0 都返回false return explore != null && (int)explore.GetValue("GroupView", -1) == 0; } } } public void DownloadGroupByEnable() { using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) { using (var explore = hklm.OpenSubKey(TargetRegPath, true)) { // 路径不存在时不需要操作,天然符合「已清除键值」的预期 if (explore == null) return; // 第二个参数设为false,键不存在时也不会抛出异常 explore.DeleteValue("GroupView", false); explore.DeleteValue("Mode", false); } } } public void DownloadGroupByDisable() { using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)) { // CreateSubKey自动创建所有缺失的层级,已存在则直接返回可写实例 using (var explore = hklm.CreateSubKey(TargetRegPath, true)) { explore.SetValue("", "Downloads"); // 显式指定值类型为DWORD,避免默认识别为字符串导致功能不生效 explore.SetValue("GroupView", 0, RegistryValueKind.DWord); explore.SetValue("Mode", 4, RegistryValueKind.DWord); } } }
注意:操作
HKEY_LOCAL_MACHINE下的注册表项需要程序以管理员权限运行,否则会出现权限不足的报错。
内容的提问来源于stack exchange,提问作者not_a_generic_user
相关产品推荐
相关产品推荐

