Advertisement
ivandrofly

A simple and efficient INI File Reader in C#

May 11th, 2014
346
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.67 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4.  
  5. namespace IniFile
  6. {
  7.     /// <summary>
  8.     /// A class for reading values by section and key from a standard ".ini" initialization file.
  9.     /// </summary>
  10.     /// <remarks>
  11.     /// Section and key names are not case-sensitive. Values are loaded into a hash table for fast access.
  12.     /// Multiple values that share the same section and key may be retrieved in a string array with <see cref="GetAllValues"/>.
  13.     /// Sections in the initialization file must have the following form:
  14.     /// <code>
  15.     ///     ; comment line
  16.     ///     [section]
  17.     ///     key=value
  18.     /// </code>
  19.     /// </remarks>
  20.     public class IniFile
  21.     {
  22.         /// <summary>
  23.         /// Initializes a new instance of the <see cref="IniFile"/> class.
  24.         /// </summary>
  25.         /// <param name="file">The initialization file path.</param>
  26.         /// <param name="commentDelimiter">The comment delimiter string (default value is ";").</param>
  27.         public IniFile(string file, string commentDelimiter = ";")
  28.         {
  29.             CommentDelimiter = commentDelimiter;
  30.             TheFile = file;
  31.         }
  32.  
  33.         /// <summary>
  34.         /// Initializes a new instance of the <see cref="IniFile"/> class.
  35.         /// </summary>
  36.         public IniFile()
  37.         {
  38.             CommentDelimiter = ";";
  39.         }
  40.  
  41.         /// <summary>
  42.         /// The comment delimiter string (default value is ";").
  43.         /// </summary>
  44.         public string CommentDelimiter { get; set; }
  45.  
  46.         private string theFile = null;
  47.  
  48.         /// <summary>
  49.         /// The initialization file path.
  50.         /// </summary>
  51.         public string TheFile
  52.         {
  53.             get
  54.             {
  55.                 return theFile;
  56.             }
  57.             set
  58.             {
  59.                 theFile = null;
  60.                 dictionary.Clear();
  61.                 if (File.Exists(value))
  62.                 {
  63.                     theFile = value;
  64.                     using (StreamReader sr = new StreamReader(theFile))
  65.                     {
  66.                         string line, section = "[]";
  67.                         while ((line = sr.ReadLine()) != null)
  68.                         {
  69.                             line = line.Trim();
  70.                             if (line.Length == 0) continue;  // empty line
  71.                             if (!String.IsNullOrEmpty(CommentDelimiter) && line.StartsWith(CommentDelimiter)) continue;  // comment
  72.  
  73.                             if (line.StartsWith("[") && line.Contains("]"))  // [section]
  74.                             {
  75.                                 int index = line.IndexOf(']');
  76.                                 section = line.Substring(0, index + 1).Trim();
  77.                                 continue;
  78.                             }
  79.  
  80.                             if (line.Contains("="))  // key=value
  81.                             {
  82.                                 int index = line.IndexOf('=');
  83.                                 string key = line.Substring(0, index).Trim();
  84.                                 string val = line.Substring(index + 1).Trim();
  85.                                 string key2 = String.Format("{0}{1}", section, key).ToLower();
  86.  
  87.                                 if (val.StartsWith("\"") && val.EndsWith("\""))  // strip quotes
  88.                                     val = val.Substring(1, val.Length - 2);
  89.  
  90.                                 if (dictionary.ContainsKey(key2))  // ini files can have multiple values with the same key
  91.                                 {
  92.                                     index = 1;
  93.                                     string key3;
  94.                                     while (true)
  95.                                     {
  96.                                         key3 = String.Format("{0}~{1}", key2, ++index);
  97.                                         if (!dictionary.ContainsKey(key3))
  98.                                         {
  99.                                             dictionary.Add(key3, val);
  100.                                             break;
  101.                                         }
  102.                                     }
  103.                                 }
  104.                                 else
  105.                                 {
  106.                                     dictionary.Add(key2, val);
  107.                                 }
  108.                             }
  109.                         }
  110.                     }
  111.                 }
  112.             }
  113.         }
  114.  
  115.         // "[section]key"   -> "value"
  116.         // "[section]key~2" -> "value"
  117.         // "[section]key~3" -> "value"
  118.         private Dictionary<string, string> dictionary = new Dictionary<string, string>();
  119.  
  120.         private bool TryGetValue(string section, string key, out string value)
  121.         {
  122.             string key2;
  123.             if (section.StartsWith("["))
  124.                 key2 = String.Format("{0}{1}", section, key);
  125.             else
  126.                 key2 = String.Format("[{0}]{1}", section, key);
  127.  
  128.             return dictionary.TryGetValue(key2.ToLower(), out value);
  129.         }
  130.  
  131.         /// <summary>
  132.         /// Gets a string value by section and key.
  133.         /// </summary>
  134.         /// <param name="section">The section.</param>
  135.         /// <param name="key">The key.</param>
  136.         /// <param name="defaultValue">The default value.</param>
  137.         /// <returns>The value.</returns>
  138.         /// <seealso cref="GetAllValues"/>
  139.         public string GetValue(string section, string key, string defaultValue = "")
  140.         {
  141.             string value;
  142.             if (!TryGetValue(section, key, out value))
  143.                 return defaultValue;
  144.  
  145.             return value;
  146.         }
  147.  
  148.         /// <summary>
  149.         /// Gets a string value by section and key.
  150.         /// </summary>
  151.         /// <param name="section">The section.</param>
  152.         /// <param name="key">The key.</param>
  153.         /// <returns>The value.</returns>
  154.         /// <seealso cref="GetValue"/>
  155.         public string this[string section, string key]
  156.         {
  157.             get
  158.             {
  159.                 return GetValue(section, key);
  160.             }
  161.         }
  162.  
  163.         /// <summary>
  164.         /// Gets an integer value by section and key.
  165.         /// </summary>
  166.         /// <param name="section">The section.</param>
  167.         /// <param name="key">The key.</param>
  168.         /// <param name="defaultValue">The default value.</param>
  169.         /// <param name="minValue">Optional minimum value to be enforced.</param>
  170.         /// <param name="maxValue">Optional maximum value to be enforced.</param>
  171.         /// <returns>The value.</returns>
  172.         public int GetInteger(string section, string key, int defaultValue = 0, int minValue = int.MinValue, int maxValue = int.MaxValue)
  173.         {
  174.             string stringValue;
  175.             if (!TryGetValue(section, key, out stringValue))
  176.                 return defaultValue;
  177.  
  178.             int value;
  179.             if (!int.TryParse(stringValue, out value))
  180.             {
  181.                 double dvalue;
  182.                 if (!double.TryParse(stringValue, out dvalue))
  183.                     return defaultValue;
  184.                 value = (int)dvalue;
  185.             }
  186.  
  187.             if (value < minValue)
  188.                 value = minValue;
  189.             if (value > maxValue)
  190.                 value = maxValue;
  191.             return value;
  192.         }
  193.  
  194.         /// <summary>
  195.         /// Gets a double floating-point value by section and key.
  196.         /// </summary>
  197.         /// <param name="section">The section.</param>
  198.         /// <param name="key">The key.</param>
  199.         /// <param name="defaultValue">The default value.</param>
  200.         /// <param name="minValue">Optional minimum value to be enforced.</param>
  201.         /// <param name="maxValue">Optional maximum value to be enforced.</param>
  202.         /// <returns>The value.</returns>
  203.         public double GetDouble(string section, string key, double defaultValue = 0, double minValue = double.MinValue, double maxValue = double.MaxValue)
  204.         {
  205.             string stringValue;
  206.             if (!TryGetValue(section, key, out stringValue))
  207.                 return defaultValue;
  208.  
  209.             double value;
  210.             if (!double.TryParse(stringValue, out value))
  211.                 return defaultValue;
  212.  
  213.             if (value < minValue)
  214.                 value = minValue;
  215.             if (value > maxValue)
  216.                 value = maxValue;
  217.             return value;
  218.         }
  219.  
  220.         /// <summary>
  221.         /// Gets a boolean value by section and key.
  222.         /// </summary>
  223.         /// <param name="section">The section.</param>
  224.         /// <param name="key">The key.</param>
  225.         /// <param name="defaultValue">The default value.</param>
  226.         /// <returns>The value.</returns>
  227.         public bool GetBoolean(string section, string key, bool defaultValue = false)
  228.         {
  229.             string stringValue;
  230.             if (!TryGetValue(section, key, out stringValue))
  231.                 return defaultValue;
  232.  
  233.             return (stringValue != "0" && !stringValue.StartsWith("f", true, null));
  234.         }
  235.  
  236.         /// <summary>
  237.         /// Gets an array of string values by section and key.
  238.         /// </summary>
  239.         /// <param name="section">The section.</param>
  240.         /// <param name="key">The key.</param>
  241.         /// <returns>The array of values, or null if none found.</returns>
  242.         /// <seealso cref="GetValue"/>
  243.         public string[] GetAllValues(string section, string key)
  244.         {
  245.             string key2, key3, value;
  246.             if (section.StartsWith("["))
  247.                 key2 = String.Format("{0}{1}", section, key).ToLower();
  248.             else
  249.                 key2 = String.Format("[{0}]{1}", section, key).ToLower();
  250.  
  251.             if (!dictionary.TryGetValue(key2, out value))
  252.                 return null;
  253.  
  254.             List<string> values = new List<string>();
  255.             values.Add(value);
  256.             int index = 1;
  257.             while (true)
  258.             {
  259.                 key3 = String.Format("{0}~{1}", key2, ++index);
  260.                 if (!dictionary.TryGetValue(key3, out value))
  261.                     break;
  262.                 values.Add(value);
  263.             }
  264.  
  265.             return values.ToArray();
  266.         }
  267.     }
  268. }
  269. Using the class in your program is as simple as instantiating it and calling the various reader methods.
  270.  
  271.  Collapse | Copy Code
  272. var iniFile = new IniFile("MyFile.ini");
  273. string font = iniFile.GetValue("Text Style", "Font", "Arial");
  274. int  size = iniFile.GetInteger("Text Style", "Size", 12);
  275. bool bold = iniFile.GetBoolean("Text Style", "Bold", false);
  276. I hope that you find this code useful!
  277.  
  278. - Bruce
  279. Souce: http://www.codeproject.com/Tips/771772/A-simple-and-efficient-INI-File-Reader-in-Csharp?msg=4818144#xx4818144xx
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement