Search code examples
c#.netregistry

How to add nested Registry Key/Value in C#?


Given a registry path "\a\b\c\d", I would like to add a value to key 'd'. The catch is - I don't know whether a,b, or c even exist, and I want the code to generate them if they do not exist. Is there a quick way (using some .NET method I haven't seen) to do this? I could go the route of iterating through registry keys and use the OpenSubKey/GetValue/SetValue methods to perform the process, but would like to avoid reinventing the wheel if I can...

N.B.: The behavior I am looking for is the same behavior you would get from running a .reg file (it will create the necessary subkeys).

Thanks,

Assaf


Solution

  • I don't know of a built-in, single call you can make to do this. However, you don't need to call OpenSubKey/GetValue, etc. A call to CreateSubKey will create a new key, or open the existing key if it exists.

    RegistryKey regKey = startingRootKey;
    string[] RegKeys = pathToAdd.split('\'');
    foreach (string key in RegKeys) {
        regKey = regKey.CreateSubKey(key);
    }
    regKey.SetValue("ValueName", "Value");
    

    Ignore the extra ' in there, I needed it to make the formatting look right. ??

    Also, be sure you test for exceptions when doing registry key adds... there's a lot security- and path-wise that could go wrong. A list of exceptions to trap is here.


    EDIT
    I'm making this too complicated! I just tested... the following will do exactly what you want:

    RegistryKey regKey = startingRootKey;
    regKey = regKey.CreateSubKey(@"a\b\c\d");
    regKey.SetValue("ValueName", "Value");
    regKey.Close();
    

    It's smart enough to parse the nested path. Just make sure you have the @ symbol, or it will treat the string is as if it were escaped.