Click here to Skip to main content
15,867,308 members
Articles / Programming Languages / C#
Article

Read, write and delete from registry with C#

Rate me:
Please Sign up or sign in to vote.
4.67/5 (135 votes)
17 Dec 20022 min read 923.5K   34.5K   187   89
An useful simple class to read, write, delete values from registry with C#.

Introduction

I've done a little update, now this class provides six functions:

  • Read to read a registry key.
  • Write to write into a registry key.
  • DeleteKey to delete a registry key.
  • DeleteSubKeyTree to delete a sub key and any child.
  • SubKeyCount to retrieve the count of subkeys at the current key.
  • ValueCount to retrieve the count of values in the key.

and three properties:

  • ShowError to show or hide error messages (default = false).
  • SubKey to set the subkey value (default = "SOFTWARE\\" + Application.ProductName).
  • BaseRegistryKey to set the base registry key value (default = Registry.LocalMachine).

Source code

Importing other namespaces...

C#
using System;
// it's required for reading/writing into the registry:
using Microsoft.Win32;      
// and for the MessageBox function:
using System.Windows.Forms;

Read function

  • input: the key name (string)
  • output: value of the key (string)
C#
public string Read(string KeyName)
{
    // Opening the registry key
    RegistryKey rk = baseRegistryKey ;
    // Open a subKey as read-only
    RegistryKey sk1 = rk.OpenSubKey(subKey);
    // If the RegistrySubKey doesn't exist -> (null)
    if ( sk1 == null )
    {
        return null;
    }
    else
    {
        try 
        {
            // If the RegistryKey exists I get its value
            // or null is returned.
            return (string)sk1.GetValue(KeyName.ToUpper());
        }
        catch (Exception e)
        {
            // AAAAAAAAAAARGH, an error!
            ShowErrorMessage(e, "Reading registry " + KeyName.ToUpper());
            return null;
        }
    }
}

Write function

  • input: the key name (string) and its value (object)
  • output: true if OK or false if error
C#
public bool Write(string KeyName, object Value)
{
    try
    {
        // Setting
        RegistryKey rk = baseRegistryKey ;
        // I have to use CreateSubKey 
        // (create or open it if already exits), 
        // 'cause OpenSubKey open a subKey as read-only
        RegistryKey sk1 = rk.CreateSubKey(subKey);
        // Save the value
        sk1.SetValue(KeyName.ToUpper(), Value);

        return true;
    }
    catch (Exception e)
    {
        // AAAAAAAAAAARGH, an error!
        ShowErrorMessage(e, "Writing registry " + KeyName.ToUpper());
        return false;
    }
}

DeleteKey function

  • input: the key name (string)
  • output: true if OK or false if error
C#
public bool DeleteKey(string KeyName)
{
    try
    {
        // Setting
        RegistryKey rk = baseRegistryKey ;
        RegistryKey sk1 = rk.CreateSubKey(subKey);
        // If the RegistrySubKey doesn't exists -> (true)
        if ( sk1 == null )
            return true;
        else
            sk1.DeleteValue(KeyName);

        return true;
    }
    catch (Exception e)
    {
        // AAAAAAAAAAARGH, an error!
        ShowErrorMessage(e, "Deleting SubKey " + subKey);
        return false;
    }
}

DeleteSubKeyTree function

  • input: void
  • output: true if OK or false if error
C#
public bool DeleteSubKeyTree()
{
    try
    {
        // Setting
        RegistryKey rk = baseRegistryKey ;
        RegistryKey sk1 = rk.OpenSubKey(subKey);
        // If the RegistryKey exists, I delete it
        if ( sk1 != null )
            rk.DeleteSubKeyTree(subKey);

        return true;
    }
    catch (Exception e)
    {
        // AAAAAAAAAAARGH, an error!
        ShowErrorMessage(e, "Deleting SubKey " + subKey);
        return false;
    }
}

SubKeyCount function

  • input: void
  • output: number of subkeys at the current key
C#
public int SubKeyCount()
{
    try
    {
        // Setting
        RegistryKey rk = baseRegistryKey ;
        RegistryKey sk1 = rk.OpenSubKey(subKey);
        // If the RegistryKey exists...
        if ( sk1 != null )
            return sk1.SubKeyCount;
        else
            return 0; 
    }
    catch (Exception e)
    {
        // AAAAAAAAAAARGH, an error!
        ShowErrorMessage(e, "Retriving subkeys of " + subKey);
        return 0;
    }
}

ValueCount function

  • input: void
  • output: number of values in the key
C#
public int ValueCount()
{
    try
    {
        // Setting
        RegistryKey rk = baseRegistryKey ;
        RegistryKey sk1 = rk.OpenSubKey(subKey);
        // If the RegistryKey exists...
        if ( sk1 != null )
            return sk1.ValueCount;
        else
            return 0; 
    }
    catch (Exception e)
    {
        // AAAAAAAAAAARGH, an error!
        ShowErrorMessage(e, "Retriving keys of " + subKey);
        return 0;
    }
}

ShowErrorMessage function

This is a private function to show the error message if the property showError = true.

C#
private void ShowErrorMessage(Exception e, string Title)
{
    if (showError == true)
        MessageBox.Show(e.Message,
                Title
                ,MessageBoxButtons.OK
                ,MessageBoxIcon.Error);
}

Using the code

First of all, you have to import its namespace:

C#
using Utility.ModifyRegistry;

and to instantiate your class:

C#
ModifyRegistry myRegistry = new ModifyRegistry();

The three properties have already their default values. However, you can modify them:

propertydefault valueexample
ShowErrorfalsemyRegistry.ShowError = true;
BaseRegistryKeyRegistry.LocalMachinemyRegistry.BaseRegistryKey = Registry.CurrentUser;
SubKey"SOFTWARE\\" + Application.ProductNamemyRegistry.SubKey = "SOFTWARE\\MYPROGRAM\\MYSUBKEY";

OK, now you can read, write, and delete from your registry.

To read:

C#
myRegistry.Read("MY_KEY");

Note: if MY_KEY doesn't exist, the Read function will return null.

To write:

C#
myRegistry.Write("MY_KEY", "MY_VALUE");

Note: if the SubKey doesn't exist, it will be automatically created.

To delete a single key:

C#
myRegistry.DeleteKey("MY_KEY");

Note: also if the MY_KEY doesn't exist, this function will return TRUE.

To delete the subkey tree:

C#
myRegistry.DeleteSubKeyTree();

Note: this code will delete the SubKey and all its children.

To retrieve the count of subkeys at the current key:

C#
myRegistry.SubKeyCount();

To retrieve the count of values in the key:

C#
myRegistry.ValueCount();

Example

The following code is an example from my in progress RTF file editor program. This code retrieves the "Recent files" list from registry:

C#
[...]
ModifyRegistry myRegistry = new ModifyRegistry();
myRegistry.SubKey = "SOFTWARE\\RTF_SHARP_EDIT\\RECENTFILES";
myRegistry.ShowError = true;
int numberValues = myRegistry.ValueCount();

for (int i = 0; i < numberValues; i++)
{
    arrayRecentFiles[i] = myRegistry.Read(i.ToString());
    [...]

and this code writes the "Recent files" list into registry:

C#
ModifyRegistry myRegistry = new ModifyRegistry();
myRegistry.SubKey = "SOFTWARE\\RTF_SHARP_EDIT\\RECENTFILES";
myRegistry.ShowError = true;
myRegistry.DeleteSubKeyTree();
for (int i = 0; i < 8 ; i++)
{
    if (arrayRecentFiles[i] == null)
        break;
    myRegistry.Write(i.ToString(), arrayRecentFiles[i]);
}

Conclusion

The .NET framework has a lot of functions to read and modify the registry, my class is only a start point. I hope this helps!

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
Italy Italy
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionLicense stuff Pin
Member 1226417712-Oct-20 23:17
Member 1226417712-Oct-20 23:17 
QuestionEasy to use, I created webbrowser addition Pin
RobScripta27-Sep-18 1:13
professionalRobScripta27-Sep-18 1:13 
QuestionThis Is Awesome 2017 and still good Pin
actualmanx4-Nov-17 14:10
actualmanx4-Nov-17 14:10 
QuestionOne correction for the write. Pin
Member 1132904718-Sep-17 4:30
Member 1132904718-Sep-17 4:30 
PraiseNice! Pin
Rasik Bihari Tiwari22-Jan-17 19:41
professionalRasik Bihari Tiwari22-Jan-17 19:41 
QuestionMy ModifyRegistry code Pin
anhr16-Jan-17 18:13
anhr16-Jan-17 18:13 
Questionmy vote of 1 Pin
Member 871442129-Sep-16 6:46
Member 871442129-Sep-16 6:46 
GeneralMy vote of 5 Pin
arthurgitau13-Sep-16 21:36
arthurgitau13-Sep-16 21:36 
QuestionWrite on Current_User Pin
TatsuSheva8-Jul-16 1:15
TatsuSheva8-Jul-16 1:15 
AnswerRe: Write on Current_User Pin
actualmanx28-Aug-22 23:27
actualmanx28-Aug-22 23:27 
GeneralNicely done. Pin
Michael Gledhill3-Nov-15 2:12
Michael Gledhill3-Nov-15 2:12 
GeneralMy vote of 4 Pin
Member 1071980317-Aug-15 8:22
Member 1071980317-Aug-15 8:22 
Questiongreat article Pin
cw229013-Jul-15 6:07
cw229013-Jul-15 6:07 
GeneralGreat stuff Pin
Windy Hendwiananda20-Jun-15 5:51
professionalWindy Hendwiananda20-Jun-15 5:51 
Suggestiondefault value if not found Pin
richard525417-Feb-15 22:51
richard525417-Feb-15 22:51 
QuestionBase of Registry.LocalMachine does not work Pin
Andrew Morpeth4-Jan-15 14:17
Andrew Morpeth4-Jan-15 14:17 
AnswerRe: Base of Registry.LocalMachine does not work Pin
Andrew Morpeth5-Jan-15 8:07
Andrew Morpeth5-Jan-15 8:07 
GeneralMy vote of 5 Pin
datdit3-Nov-14 4:52
datdit3-Nov-14 4:52 
QuestionCaps in Registry changed from .ToUpper Pin
actualmanx21-Sep-14 4:31
actualmanx21-Sep-14 4:31 
QuestionGet default value ? Pin
Wrangly5-Jun-14 3:48
Wrangly5-Jun-14 3:48 
QuestionI made one modification Pin
Mike Magill23-Jan-14 6:39
Mike Magill23-Jan-14 6:39 
SuggestionDWORDs and other stuff Pin
James McCullough20-Oct-13 13:40
professionalJames McCullough20-Oct-13 13:40 
GeneralMy vote of 5 Pin
Sampath Lokuge29-Sep-13 2:47
Sampath Lokuge29-Sep-13 2:47 
GeneralMy vote of 5 Pin
Renju Vinod15-Jul-13 20:24
professionalRenju Vinod15-Jul-13 20:24 
QuestionThanks for the utility Pin
arvindps3-Jul-13 19:37
arvindps3-Jul-13 19:37 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.