среда, 29 июня 2011 г.

Программка на C# для парсинга ini файлов

Возникла необходимость чтения и записи в ini файл 
выкладываю две процедуры соответственно getvalue и  setvalue,с комментариями.



предполагается что :
[group]
; комментарий
section=value ;



отмечу:
1. Если строка имеет вид типа: "woafont=dosapp.fon" - все нормально, а
если "woafont = dosapp.fon", то в значении появляется пробел (между
знаком равно и значением). Надо сделать trim();
2. Если строка имеет вид: "woafont = dosapp.fon; комментарий", то
значение читается вместе с комментарием;
3. Тоже самое если:  "woafont = dosapp.fon ;комментарий";



Все это можно реализовать небольшой доработкой,но выкладываю как есть,если что есть пишите


 private void setvalue(string file,string fgroup, string fsection, string fvalue)
        {   string group = fgroup;
            string section = fsection;
            string value= fvalue;
            //создаем поток на чтение если файл существует
            if (File.Exists(file))
            {
                StreamReader sr = new StreamReader(file);
                //создаем коллекцию ,можно было бы использовать хештаблицу но она не гаранирует порядок,
                //я думаю были бы проблемы с комментариями ,особенно в середине файла

                ArrayList mass = new ArrayList();
                //читаем до конца файла
                while (!sr.EndOfStream)
                {//можно бы сделать чтение из файла отдельной процедурой и хранить в течение работы программы
                    //а потом при закрытии записывать
                    mass.Add(sr.ReadLine());
                    //если найдено название группы ищем название настройки
                    if (mass[mass.Count - 1].ToString().Trim().StartsWith(group))
                    {
                        mass.Add(sr.ReadLine());
                        //ищем название настройки пока нет следующей группы или конца файла
                        while (!sr.EndOfStream && !mass[mass.Count - 1].ToString().Trim().StartsWith("["))
                        {
                            if (mass[mass.Count - 1].ToString().Trim().StartsWith(section))
                            {
                                //если нашли настройку вырезаем значение и вставляем новое
                                //таким же образом можно сделать процедуру создания новой настройки
                                int indexvalue = mass[mass.Count - 1].ToString().IndexOf("=") + 1;
                                mass[mass.Count - 1] = mass[mass.Count - 1].ToString().Remove(indexvalue);
                                mass[mass.Count - 1] += value;
                                break;
                            }

                            mass.Add(sr.ReadLine());
                        }
                    }

                }
                sr.Close();
                //уменьшаем массив убирая лишние пустые элементы
                mass.TrimToSize();
                //записываем в файл
                try
                {
                    File.WriteAllLines(textBox1.Text, (String[])mass.ToArray(typeof(string)), System.Text.Encoding.Default);
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }

private string getvalue(string file, string fgroup, string fsection)
        {
         
            string selectedstring;
            string group = fgroup;
            string section = fsection;
            string value="";
            if (File.Exists(file))
            {
                StreamReader sr = new StreamReader(file);
                while (!sr.EndOfStream)
                {
                    selectedstring = sr.ReadLine();
                    if (selectedstring.StartsWith(group))
                    {
                        while (!sr.EndOfStream)
                        {
                            selectedstring = sr.ReadLine();
                            if (selectedstring.StartsWith(section))
                            {
                                value = selectedstring.Substring(selectedstring.IndexOf("=") + 1);
                                break;
                            }
                        }
                    }
                    if (value != "") break;
                }
                sr.Close();
            }

            return value;
         
        }


Комментариев нет:

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

Краткая шпаргалка по EtherChannel:

Протокол агрегации портов ( P ort Ag gregation P rotocol (PAgP)) и протокол управления агрегацией каналов ( L ink A ggregation C ontrol P ...