Удалить ключ реестра с помощью C #

Я пытаюсь удалить такой ключ реестра:

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

oRegistryKey.DeleteSubKeyTree(".");

Но это дает мне исключение:

Невозможно удалить дерево подключей, потому что подключ не существует

Если я изменю DeleteSubKeyTree на DeleteSubKey, я получу другое исключение:

Ключ реестра имеет подключи, и этот метод не поддерживает рекурсивное удаление.


person Digvijay Rathore    schedule 27.08.2015    source источник
comment
Думаю, довольно логичные ошибки, ищите их в regedit.exe, проверяйте дерево и корректируйте свой код.   -  person Xyv    schedule 27.08.2015
comment
Я проверил, что это там в regedit в том же месте. не понимаю, что делать сейчас   -  person Digvijay Rathore    schedule 27.08.2015
comment
Итак, вы хотите открыть Software \ Microsoft \ Windows \ CurrentVersion \ Explorer и DeleteSubKeyTree (FileExts). Очень просто. Осторожнее с бензопилой.   -  person Hans Passant    schedule 27.08.2015
comment
Префикс o в вашей переменной oRegistryKey представляет так называемую нотацию системного венгерского языка. Microsoft не рекомендует использовать эту практику именования переменных при написании кода для .NET Framework.   -  person DavidRR    schedule 10.01.2017


Ответы (5)


Попробуй это:

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: DeleteSubKeyTree сообщает, что подключ не существует, но это так!

person Rahul Tripathi    schedule 27.08.2015
comment
исключение: не существует значения с таким именем - person Digvijay Rathore; 27.08.2015
comment
спасибо за помощь @Rahul Tripathi ссылка работала нормально. - person Digvijay Rathore; 27.08.2015

Подход, описанный в этом ответе, излишне сложен, поскольку 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 ключ пользователя? Я считаю, что большинство сочло бы это неоправданно разрушительным и безрассудным. Более распространенным сценарием было бы удаление ключа расширения одного файла (например, .hdr) из FileExts ключ.

Наконец, обратите внимание, что DeleteSubKeyTree перегружен. Вот подпись второй версии этого метода:

public void DeleteSubKeyTree(
    string subkey,
    bool throwOnMissingSubKey
)

В этой версии, если subkey не существует и throwOnMissingSubKey имеет значение false, DeleteSubKeyTree просто вернется без внесения каких-либо изменений в реестр.

person DavidRR    schedule 10.01.2017

Обратите внимание на 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);
person Riccardo Bassilichi    schedule 31.10.2019

Это поможет вам ............

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

person Community    schedule 27.08.2015

Для начала нужно проверить ключ реестра:

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");
    }
person vikky    schedule 27.08.2015
comment
Дополнительная информация: значение с таким именем не существует. - person Digvijay Rathore; 27.08.2015