[C#] *.ini parse

В тему о велосипедах и их создании. Класс для парсинга INI-файлов. Основа была найдена на просторах Сети и допилена под личные нужды.
Что умеет класс:

  1. Загрузка данных из файла.
  2. Сохранение данных в файл.
  3. Получение всех ключей из заданной секции.
  4. Получение всех пар «ключ-значение» из заданной секции.
  5. Получение всех пар «секция-ключ» соответствующие заданному значению (бывает, что и такое надо).
  6. Добавление данных.
  7. Удаление данных.

Код класса:

using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
 
namespace INI
{
    public class ini_parser
    {
        private Hashtable keyPairs = new Hashtable();
        private String iniFilePath;
 
        private struct SectionPair
        {
            public String Section;
            public String Key;
        }
        /// <summary>
        /// Opens the INI file at the given path and enumerates the values in the IniParser.
        /// </summary>
        /// <param name="iniPath">Full path to INI file.</param>
        public ini_parser(String iniPath)
        {
            TextReader iniFile = null;
            String strLine = null;
            String currentRoot = null;
            String[] keyPair = null;
            String comment = "#";
            this.iniFilePath = iniPath;
 
            if (File.Exists(iniPath))
            {
                try
                {
                    iniFile = new StreamReader(iniPath);
 
                    strLine = iniFile.ReadLine();
 
                    while (strLine != null)
                    {
                        strLine = strLine.Trim();
 
                        if (strLine != "")
                        {
                            if (strLine.StartsWith("[") && strLine.EndsWith("]"))
                            {
                                currentRoot = strLine.Substring(1, strLine.Length - 2);
                            }
                            else
                            {
                                if (!strLine.StartsWith(comment))
                                {
                                    keyPair = strLine.Split(new char[] { '=' }, 2);
 
                                    SectionPair sectionPair;
                                    String value = null;
 
                                    if (currentRoot == null)
                                        currentRoot = "ROOT";
 
                                    sectionPair.Section = currentRoot;
                                    sectionPair.Key = keyPair[0];
 
                                    if (keyPair.Length > 1)
                                        value = keyPair[1];
 
                                    this.keyPairs.Add(sectionPair, value);
                                }
                            }
                        }
 
                        strLine = iniFile.ReadLine();
                    }
 
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                finally
                {
                    if (iniFile != null)
                        iniFile.Close();
                }
            }
            else
                throw new FileNotFoundException("Unable to locate " + iniPath);
 
        }
        /// <summary>
        /// Returns the value for the given section, key pair.
        /// </summary>
        /// <param name="sectionName">Section name.</param>
        /// <param name="settingName">Key name.</param>
        public String GetSetting(String sectionName, String settingName)
        {
            SectionPair sectionPair;
            sectionPair.Section = sectionName.ToUpper();
            sectionPair.Key = settingName.ToUpper();
            return (String)this.keyPairs[sectionPair];
        }
        /// <summary>
        /// Enumerates all lines for given section.
        /// </summary>
        /// <param name="sectionName">Section to enum.</param>
        public String[] EnumSection(String sectionName)
        {
            ArrayList tmpArray = new ArrayList();
 
            foreach (SectionPair pair in this.keyPairs.Keys)
            {
                if (pair.Section == sectionName.ToUpper())
                    tmpArray.Add(pair.Key);
            }
 
            return (String[])tmpArray.ToArray(typeof(String));
        }
        /// <summary>
        /// Enumerates all key-value pairs for given section.
        /// </summary>
        /// <param name="sectionName">Section to enum.</param>
        /// <returns>Dictionary equals to INI-section.</returns>
        public Dictionary<String, String> EnumSectionKeyValue(String sectionName)
        {
            Dictionary<String, String> ret = new Dictionary<String, String>();
 
            foreach (SectionPair pair in this.keyPairs.Keys)
            {
                if (pair.Section == sectionName.ToUpper())
                {
                    ret.Add(pair.Key, this.GetSetting(sectionName, pair.Key));
                }
            }
            return ret;
        }
        /// <summary>
        /// Enumarates all section-key pairs equal given value.
        /// </summary>
        /// <param name="value">Value to enum.</param>
        /// <returns>Dictionary.</returns>
        public Dictionary<String, String> EnumValue(String value)
        {
            Dictionary<String, String> ret = new Dictionary<String, String>();
            foreach (SectionPair pair in this.keyPairs.Keys)
            {
                if (this.GetSetting(pair.Section, pair.Key) == value)
                {
                    ret.Add(pair.Section, pair.Key);
                }
            }
            return ret;
        }
        /// <summary>
        /// Adds or replaces a setting to the table to be saved.
        /// </summary>
        /// <param name="sectionName">Section to add under.</param>
        /// <param name="settingName">Key name to add.</param>
        /// <param name="settingValue">Value of key.</param>
        public void AddSetting(String sectionName, String settingName, String settingValue)
        {
            SectionPair sectionPair;
            sectionPair.Section = sectionName.ToUpper();
            sectionPair.Key = settingName.ToUpper();
 
            if (this.keyPairs.ContainsKey(sectionPair))
                this.keyPairs.Remove(sectionPair);
 
            this.keyPairs.Add(sectionPair, settingValue);
        }
        /// <summary>
        /// Adds or replaces a setting to the table to be saved with a null value.
        /// </summary>
        /// <param name="sectionName">Section to add under.</param>
        /// <param name="settingName">Key name to add.</param>
        public void AddSetting(String sectionName, String settingName)
        {
            AddSetting(sectionName, settingName, null);
        }
        /// <summary>
        /// Remove a setting.
        /// </summary>
        /// <param name="sectionName">Section to add under.</param>
        /// <param name="settingName">Key name to add.</param>
        public void DeleteSetting(String sectionName, String settingName)
        {
            SectionPair sectionPair;
            sectionPair.Section = sectionName.ToUpper();
            sectionPair.Key = settingName.ToUpper();
 
            if (this.keyPairs.ContainsKey(sectionPair))
                this.keyPairs.Remove(sectionPair);
        }
        /// <summary>
        /// Save settings to new file.
        /// </summary>
        /// <param name="newFilePath">New file path.</param>
        public void SaveSettings(String newFilePath)
        {
            ArrayList sections = new ArrayList();
            String tmpValue = String.Empty;
            String strToSave = String.Empty;
 
            foreach (SectionPair sectionPair in this.keyPairs.Keys)
            {
                if (!sections.Contains(sectionPair.Section))
                    sections.Add(sectionPair.Section);
            }
 
            foreach (String section in sections)
            {
                strToSave += ("[" + section + "]\r\n");
 
                foreach (SectionPair sectionPair in this.keyPairs.Keys)
                {
                    if (sectionPair.Section == section)
                    {
                        tmpValue = (String)this.keyPairs[sectionPair];
 
                        if (tmpValue != null)
                            tmpValue = "=" + tmpValue;
 
                        strToSave += (sectionPair.Key + tmpValue + "\r\n");
                    }
                }
 
                strToSave += "\r\n";
            }
 
            try
            {
                TextWriter tw = new StreamWriter(newFilePath);
                tw.Write(strToSave);
                tw.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Save settings back to ini file.
        /// </summary>
        public void SaveSettings()
        {
            SaveSettings(this.iniFilePath);
        }
    }
}

, ,

3 комментария
  1. Денис Said:

    а можно пример использования?

  2. KronuS Said:

    Использовали данный класс как базу для singleton/registry в HRBhttp://pastebin.com/6u4qUs3n. Конечно, registry вводит тесную связь между объектами системы, но на момент создания HRB и так было нормально.

  3. Алексей Said:

    не работает метод GetSetting, убрал ToUpper(), и заработало :-О

Оставить комментарий

Top ↑ | Main page | Back