Возникла необходимость чтения и записи в ini файл
выкладываю две процедуры соответственно getvalue и setvalue,с комментариями.
отмечу:
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;
}
выкладываю две процедуры соответственно 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;
}
Комментариев нет:
Отправить комментарий