использовать метод CreateSubKey()
(который автоматически предоставляет доступ к ключу для чтения-записи через возвращаемую ссылку):
RegistryKey Hklm = Registry.LocalMachine;
RegistryKey HkSoftware = Hklm.OpenSubKey('Software');
RegistryKey HkMine = HkSoftware.CreateSubKey('MyOwnSoftware');
Способ работы CreateSubKey()
достаточно интересен: он будет создавать ключ, если тот еще не существует, а если уже существует, то будет возвращать экземпляр RegistryKey
, который представляет существующий ключ. Причина такого поведения метода состоит в способе использования реестра. Реестр в целом содержит долговременные данные, например, конфигурационную информацию для Windows и различных приложений. Поэтому не очень часто возникает ситуация, когда необходимо явно создать ключ.
Более распространена ситуация, когда приложению необходимо убедиться, что некоторые данные присутствуют в реестре, другими словами, создать соответствующие ключи, если они еще не существуют, но ничего не делать, если они существуют. Метод CreateSubKey()
прекрасно с этим справляется. В отличие, например, от ситуации с FileInfo.Open()
у CreateSubKey()
нет возможности случайно удалить какие-либо данные. Если целью действительно является удаление ключей реестра, то необходимо явно вызвать метод RegistryKey.Delete()
. Это имеет смысл с учетом важности реестра для Windows. Меньше всего хотелось бы полностью разрушить Windows, удалив пару важных ключей во время отладки обращений к реестру в C#.
Когда ключ реестра для чтения или модификации найден, можно использовать методы SetValue()
или GetValue()
для задания или получения из них данных. Оба эти метода получают в качестве параметра строку, задающую имя значения, a SetValue()
требует дополнительно ссылку на объект, содержащий детали значения. Так как параметр определяется как объектная ссылка, то он может действительности быть ссылкой на любой класс по желанию. SetValue()
будет определять по типу реально предоставленного класса, как задать значение REG_SZ
, REG_DWORD
или REG_BINARY
. Например:
RegistryKey HkMine = HkSoftware.CreateSubKey('MyOwnSoftware');
HkMine.SetValue('MyStringValue', 'Hello World');
HkMine.SetValue(MyIntValue', 20);
Этот код задает для ключа два значения: MyStringValue
будет иметь тип REG_SZ
, а MyIntValue
— тип REG_DWORD
. В последующем примере будут рассмотрены только эти два типа.
RegistryKey.GetValue()
работает по большей части таким же образом. Он определен для возврата объектной ссылки, а значит, он может на самом деле вернуть ссылку на string
, если обнаружит значение типа REG_SZ
, и int
, если это значение имеет тип REG_DWORD
:
string StringValue = (string)HkMine.GetValue('MyStringValue');
int IntValue = (int)HkMine.Get.Value('MyIntValue');
И наконец, по окончании чтения или модификации данных ключ необходимо закрыть:
HkMine.Close();
Помимо этих методов, RegistryKey
реализует большое число других методов и свойств. Таблицы представляют выборку наиболее употребительных:
Свойства
Имя свойства | Назначение |
---|---|
Name | Имя ключа (только для чтения) |
SubKeyCount | Число потомков этого ключа |
ValueCount | Сколько значений содержит ключ |
Методы
Имя | Назначение |
---|---|
Close() | Закрывает ключ |
CreateSubKey() | Создает подключ с заданным именем (или открывает его, если он уже существует) |
DeleteSubKey() | Удаляет заданный подключ |
DeleteSubKeyTree() | Рекурсивно удаляет подключ и всех его потомков |
DeleteValue() | Удаляет именованное значение из ключа |
GetSubKeyNames() | Возвращает массив строк, содержащих имена подключей |
GetValue() | Возвращает именованное значение |
GetValueNames() |