Click here to Skip to main content
Click here to Skip to main content

Registry Export File (.reg) Parser

By , 19 Apr 2011
 

Introduction

You may already - like me some time ago - have needed a possibility to read and to analyze an exported .reg file, in order to compare the given registry values or to import only few of the exported registry values.

In my case, I had to read a reg file of ca. 30 MB size, then to compare all values with the existing registry values and change some of them - some kind of backup/restore solution for poor men ;-). I spent some time searching on the Internet for a ready-to-use solution, but all that I found was either another language (C++, VBS) or something not really efficient. So I decided to write my own DLL library to read and parse a reg file.

Background

I already used the .NET Regex class in some projects and was really amazed at how smart the Regex methods have been coded, working much quicker as for example the String class methods. My read function needs less than 5 seconds to read my 30 MB reg file on a standard 3Ghz PC (Windows 7).

The main class is the RegFileObject class.

RegFileObject.png

The raw content of the .reg file is stored in the private field content. The parsed registry values are stored in the RegValues generic dictionary. The dictionary keys are the registry keys found in the .reg file. The dictionary values are again dictionaries with registry values names as dictionary keys and registry values data as dictionary values.

The RegValueObject class diagram:

RegValueObject.png

The main parsing function is the NormalizeDictionary function. It "slices" the raw text content using a given search pattern. It returns the output as a dictionary with found matches as dictionary keys and the whole raw text content between the current match end and next match begin as dictionary value.

/// <summary>
/// Creates a flat Dictionary using given search pattern
/// </summary>
/// <param name="searchPattern">The search pattern</param>
/// <param name="content">The content string to be parsed</param>
/// <param name="stripeBraces">Flag for striping braces 
/// (true for reg keys, false for reg values)</param>
/// <returns>A Dictionary with retrieved keys and remaining content</returns>
private Dictionary<String, String> NormalizeDictionary
	(String searchPattern, String content, bool stripeBraces)
{
    MatchCollection matches = 
	Regex.Matches(content, searchPattern, RegexOptions.Multiline);
	
    Int32 startIndex = 0;
    Int32 lengthIndex = 0;
    Dictionary<String, String> dictKeys = new Dictionary<string, string>();
      
    foreach (Match match in matches)
    {
        try
        {
          //Retrieve key
          String sKey = match.Value;
          if (sKey.EndsWith("\r\n")) sKey = sKey.Substring(0, sKey.Length - 2);
          if (sKey.EndsWith("=")) sKey = sKey.Substring(0, sKey.Length - 1);
          if (stripeBraces) sKey = StripeBraces(sKey);
          if (sKey == "@") 
            sKey = "";
          else
            sKey = StripeLeadingChars(sKey, "\"");
          
          //Retrieve value
          startIndex = match.Index + match.Length;
          Match nextMatch = match.NextMatch();
          lengthIndex = ((nextMatch.Success) ? 
		nextMatch.Index : content.Length) - startIndex;       
          String sValue = content.Substring(startIndex, lengthIndex);
          //Removing the ending CR
          if (sValue.EndsWith("\r\n")) sValue = sValue.Substring(0, sValue.Length - 2);
          dictKeys.Add(sKey, sValue);
      }
      catch (Exception ex)
      {
          throw new Exception(String.Format
          	("Exception thrown on processing string {0}", match.Value), ex);
      }
    }
    return dictKeys;
}

The ParseFile function calls the NormalizeDictionary method in two steps: to scan for all registry keys in the first (the search pattern is "^[\t ]*\\[.+\\]\r\n") and to parse registry values for each registry key found in the first step in the second step (search pattern: "^[\t ]*(\".+\"|@)=").

Limitations

My .reg file parser doesn't support the remove directives (-[HKEY_LOCAL_MACHINE\SOFTWARE\TestSoftware]), as it was not in focus of my project.

I have surely not discovered all issues on parsing f. ex. very "exotic" .reg files, but for my project, it was absolutely sufficient. The simplicity of the hereby presented parsing routines allow however to easily enhance the library by new functions.

Using the Code

The .reg file will be read on creating an instance of the RegFileObject class:

RegFileObject regfile = new RegFileObject(@"C:\Temp\test.reg"); 

The searched registry value can be simply accessed by typing:

RegValueObject tempValue = regfile.RegValues
	[@"HKEY_LOCAL_MACHINE\SOFTWARE\TestSoftware"]["TestValue"]; 

and the value data by querying the property Value:

String tempData = tempValue.Value; 

or directly:

RegFileObject regfile = new RegFileObject(@"C:\Temp\test.reg");
String tempData = regfile.RegValues
	[@"HKEY_LOCAL_MACHINE\SOFTWARE\TestSoftware"]["TestValue"].Value; 

The RegValues Dictionary can be very simply enumerated using the foreach or for statements.

History

  • 2010, 8th November: Initial release
  • 2011, 14th April: Fixed some typos

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Henryk Filipowicz
Software Developer
Germany Germany
Member
MCTS .NET Framework 2.0

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Questionpublishing on my website: http://autoid.de.tlmembernxexoxn1 Feb '12 - 20:44 
QuestioninteratingmemberJustin Sunseri22 Nov '10 - 6:23 
AnswerRe: interating [modified]memberHenryk Filipowicz16 Mar '11 - 6:29 

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

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 19 Apr 2011
Article Copyright 2010 by Henryk Filipowicz
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid