Программирование
Веб программирование

Чтение конфигурационных файлов [C#]

 
 

Здравствуйте. Я хотел бы осветить свой способ чтения конфигурационных файлов 

произвольного содержания. Под словом произвольного я имею ввиду что вы можете задавать содержание и их структуру сами.

Многие программисты называю этот способ деревянным... не знаю почему, но судите сами.

Собственно предположим что у нас есть конфиг сего содержания

Color = Color.Black
Size x=100,y=500

Привожу всего две строки . Если понять принцип то список комманд можео расширить.

вот собственно код Класса:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;

namespace SimpleLex
{
    class Lexical
    {
        //Сюда передается путь к файлу конфигурации
        public string Path = "";
        //Определяем ключевые слова 
        string regular = "Color|Size|Name";
        public void lexical()
        {
            //Создаем массив строк для дальнейшего заполнения
            string[] conf = new string[1024];
            //Переменная счетчик
            int i = 0;
            //Заполняем массив из файла 
            //Path мы присваиваем значение при создании
            //объекта нашего класса.
            conf = File.ReadAllLines(Path);
            //Запускаем цикл чтения 
            while (conf.Length - 1 >= i)
            {
            // Создаем новый объект класса Regex
            // и передаем ему в качестве конструктора
            // cписок ключевых слов
            Regex RegularExp = new Regex(regular);
            //Начинаем поиск совпадений в текущей строке
            Match match = RegularExp.Match(conf[i]);
            while (match.Success)
            {
                //Ожидаем наличия совпадений
                break;
                //Если нашли то выпрыгиваем 
            }

            switch (match.Value) // Смотрим что же мы обнаружили и вызываем соответствующий метод
            {
                case "Color":
                    //вызываем метод Color_
                    //и передаем ему текущую строку для разбора
                    //Предварительно удалив все пробелы с двух сторон
                    //если они были метод Trim()
                    Color_(conf[i].Trim());
                    i++;
                    break;
                case "Size":
                    size_(conf[i].Trim());
                    i++;
                    break;
                default:
                    //все другое пропускаем
                    i++;
                    break;
            }
            }
        }
        void Color_(string str)
        {
            int i = 0;
            while (str.Substring(i,1)!= "=")
            {
                //Ищем разделитель в данном случае "="
                i++;
            }
            //Находим и извлекаем нужную нам информацию
            string value_ = str.Substring(i + 1, str.Length - (i+1)).Trim();
            //Теперь все зависит от вашей фантазии хотите 
            //Создайте класс который будет устанавливать цвет шрифта
            //И.т.д

            Console.WriteLine(value_);
            Console.ReadKey();
        }
        void size_(string str)
        {
            /*
             * В этом методе я хочу показать как быть если вы используете
             * в своем файле для каждой команды разные разделители
             * в теории конечно можно все это засунуть в один метод
             * Но я советую в дальнейшем если вы будите применять
             * именно такую структуру передавать в метод тип разделителя
             * и соответственно искать именно его другое дело если вы имеете
             * различный формат входных данных как у нас параметр size имеет
             * вид shize X=100,Y=500
             */
            //Есть прекрасный метод 
            int i = 0;
            while (str.Substring(i,1) != " ")
            {
                i++;
            }
            str = str.Substring(i, str.Length - i).Trim();
            string[] commandMas = new string[3];
            commandMas = str.Split(',');
            Console.WriteLine(commandMas[0]);
            Console.WriteLine(commandMas[1]);
            Console.ReadKey();
        }
    }
}

А вот как вызывать:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleLex
{
    class Program
    {
        static void Main(string[] args)
        {
            Lexical lex = new Lexical();
            lex.Path = "Conf.cfg";
            lex.lexical();
        }
    }
}

Собственно это базовая структура и отражает только принципы чтения

действия по полученным данным не производятся

Всем спасибо.


Есть вопросы? Спроси на нашем форуме!!
Кулхацкер [09.12.2012 10:47]

Перенесено в C#

Mikluha-mackly [09.12.2012 21:55]

Чтож Максим,вы знаете своё дело...

Maxim [10.12.2012 07:11]

Надеюсь это был не сарказм)Если так то спасибо.

Maxim [12.12.2012 20:51]

При поиске разделителя вместо цикла while()
{
}
можно использовать метод IndexOf().

SmallByte [24.04.2014 12:07]

Не оптимальное сохранение, да и вообще ужас!
Гораздо проще в таких случаях использовать XML



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.