使用c#删除注册表项

本文关键字:注册表 删除 使用 | 更新日期: 2023-09-27 18:10:01

我正在尝试删除注册表项:

RegistryKey oRegistryKey = Registry.CurrentUser.OpenSubKey(
    "Software''Microsoft''Windows''CurrentVersion''Explorer''FileExts", true);
oRegistryKey.DeleteSubKeyTree(".");

但是这给了我一个例外:

不能删除子键树,因为子键不存在

如果我把DeleteSubKeyTree改为DeleteSubKey,我收到一个不同的异常:

注册表项有子键,此方法不支持递归删除

使用c#删除注册表项

这个答案中概述的方法是不必要的复杂,因为DeleteSubKeyTree是递归的。来自MSDN上的文档:

递归删除子键和所有子键。

所以,如果你的目标是删除用户的FileExts键,这样做:

string explorerKeyPath = @"Software'Microsoft'Windows'CurrentVersion'Explorer";
using (RegistryKey explorerKey =
    Registry.CurrentUser.OpenSubKey(explorerKeyPath, writable: true))
{
    if (explorerKey != null)
    {
        explorerKey.DeleteSubKeyTree("FileExts");
    }
}

但是,您确定真的要删除用户的FileExts密钥吗?我相信大多数人会认为这样做会造成不合理的破坏和鲁莽。更常见的情况是,从FileExts密钥中删除单个文件扩展名密钥(例如,.hdr)。

最后,注意DeleteSubKeyTree是重载的。下面是这个方法的第二个版本的签名:

public void DeleteSubKeyTree(
    string subkey,
    bool throwOnMissingSubKey
)

在这个版本中,如果subkey不存在并且throwOnMissingSubKey为假,则DeleteSubKeyTree将简单地返回,而不需要对注册表进行任何更改。

试试这个:

string str = @"Software'Microsoft'Windows'CurrentVersion'Explorer'FileExts";
string[] strSplit = strLocal.Split('''');
            using (RegistryKey oRegistryKey = Registry.CurrentUser.OpenSubKey(@"Software'Microsoft'Windows'CurrentVersion'Explorer'FileExts", true))
            {
                RegistryKey hdr = oRegistryKey.OpenSubKey(strSplit[strSplit.Length-2], true);
                foreach (String key in hdr.GetSubKeyNames())
                    hdr.DeleteSubKey(key);
                hdr.Close();
                oRegistryKey.DeleteSubKeyTree(strSplit[strSplit.Length - 2]);
            }

也检查:注册表在。net: deleetesubkeytree说子键不存在,但是嘿,它存在!

请注意32或64注册表。注意:RegistryView.Registry64是问题的关键。

这是我的实现,为我工作:

public static void DeleteRegistryFolder(RegistryHive registryHive, string fullPathKeyToDelete)
{
    using (var baseKey = RegistryKey.OpenBaseKey(registryHive, RegistryView.Registry64))
    {
        baseKey.DeleteSubKeyTree(fullPathKeyToDelete);
    }
}

用法:

var baseKeyString = $@"SOFTWARE'Microsoft'Windows'CurrentVersion'Uninstall'MyApp";
DeleteRegistryFolder(RegistryHive.LocalMachine, baseKeyString);

这将帮助你 ............

http://www.codeproject.com/Questions/166232/C-delete-a-registry-key-cannot-get-it-done

如果'subkey'参数为空字符串,则DeleteSubKeyDeleteSubKeyTree方法都删除当前密钥,如key.DeleteSubKey("");

Key应该有写权限。

首先需要检查注册表项:

using (RegistryKey Key = Registry.CurrentUser.OpenSubKey(@"Software''Microsoft''Windows''CurrentVersion''Explorer''FileExts"))
    if (Key != null)
    {    
       key.DeleteValue("."); //delete if exist
    }
    else
    {
        MessageBox.Show("key not found");
    }