Преамбула
Задача довольно простая, имеется ключ в разделе Реестра Windows, необходимо удалить оттуда все значения (values).
Термины и определения
Реестр — иерархическая база данных, хранящая основные настройки системы и программ.
Корневой ключ (в некоторых источниках просто ключ или раздел Реестра), это один из основных ключей Реестра. Обычно присутствуют следующие:
HKEY_CLASSES_ROOT (HKCR)
— Зарегистрированные типы файлов, объекты COM и ActiveX
HKEY_CURRENT_USER (HKCU)
— Настройки текущего пользователя, в данный момент вошедшего в систему.
HKEY_LOCAL_MACHINE (HKLM)
— Общие настройки для всех пользователей данного компьютера.
HKEY_USERS (HKU)
— Профили всех пользователей данной машины.
HKEY_CURRENT_CONFIG (HKCC)
— Профили оборудования, информация о драйверах.
Подключ/Subkey (иногда Ключ, если корневой раздел называется корневым разделом или корневым ключом) Реестра — путь в Реестре, аналогичный пути к каталогу (папке) файловой системы. Обычно каждый подключ хранит или настройки для конкретного случая. Например, настройки конкретной программы или профиль конфигурации оборудования. Выглядит примерно так: Software\TestKey
(в полном виде, вместе с корневым ключом, например: HKEY_CURRENT_USER\Software\TestKey
).
Подключ может содержать как и другие подключи, так и значения (values), представляющие собой поименованные переменные, содержащие значения конкретного параметра
Обзорная статья про Реестр Windows на Википедии
Тестовый ключ
Для тестирования создадим тестовый ключ, который не будет влиять на какие либо программы и компоненты ОС. Это можно сделать, как вручную, с помощью программы Regedit, так и в автоматическом режиме, с помощью reg-файла, например, такого:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\TestKey]
"value0"="text0"
"value1"="text1"
"value2"="text2"
"value3"="text3"
"value4"="text4"
"value5"="text5"
Файл на GitHub
Можно создать и reg-файл для удаления тестового ключа из Реестра, если что-то пойдет не так:
Windows Registry Editor Version 5.00
[-HKEY_CURRENT_USER\Software\TestKey]
Файл на GitHub
Решение
1. Подключаем пространство имен Microsoft.Win32:
using Microsoft.Win32;
2. Создаем переменную с именем подключа Реестра и переменную типа RegistryKey. Этот объект и будет рулить нужной веткой Реестра:
string subkey = "Software\\TestKey";
RegistryKey key = null;
3. Любые операции с Реестром могут привести к ошибкам, потому их как и операции ввода-вывода желательно оборачивать в try..catch
:
try
{
//тут будет код.
}
catch (Exception ex)
{
Console.WriteLine("ERROR: " + ex.Message);
}
4. Открываем (под)ключ Реестра:
key = Registry.CurrentUser.OpenSubKey(subkey, true);
Внимание! Если необходимо писать в ключ Реестра, обязательно устанавливаем второй параметр функции OpenSubKey
в true
, т.к. в противном случае, мы получим ошибку UnauthorizedAccessException: Не удалось выполнить запись в раздел реестра.
Обсуждение на Cyberforum
5. Получить список значений в (под)ключе можно функцией GetValueNames()
, которая выдает строковый массив с именами значений Реестра.
6. Получаем имена всех значений и в цикле удаляем их с помощью функции DeleteValue(имя_параметра);
foreach (string valname in key.GetValueNames())
{
Console.WriteLine("Delete value: " + valname);
key.DeleteValue(valname);
}
7. Закрываем (под)ключ Реестра.
key.Close();
Все получилось:
Код целиком
На PasteBin
Тестовый пример
Пример на GitHub