Как прочитать из ini файла ???

Язык C#: программирование на C#, портирование кода C# на VB и VB на C#.

Модератор: Ramzes

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Как прочитать из ini файла ???

Сообщение dmitriy22 » 23.12.2008 (Вт) 16:56

Доброе время суток! Я истощался, пишу вам после долгих попыток поиска в инете и тестирования на компе, у меня не получается вытащить значение из ini файла:
файл sql.ini
[server1]
master=значение
query=значение

[server2]
master=значение
query=значение

ну вот мне надо вытащить значения
я использую апи функцию GetPrivateProfileString

создал класс для чтения:
Код: Выделить всё
public class IniFile
        {
            public string path;
            [DllImport("kernel32")]
            private static extern int GetPrivateProfileString(string section,
                     string key, string def, StringBuilder retVal,
                int size, string filePath);
        public IniFile(string INIPath)
        {
            path = INIPath;
        }

        public string IniReadValue(string Section,string Key)
        {
            StringBuilder temp = new StringBuilder();
            string str=GetPrivateProfileString(Section,Key,"",temp,
                                            255, this.path).ToString();
            return temp.ToString();

        }
}


затем создаю экземпляр класса
Код: Выделить всё
  IniFile ini = new IniFile("sql.ini");


затем вставляю вызов функции
Код: Выделить всё
private void Form1_Load(object sender, EventArgs e)
        {
            label3.Text = ini.IniReadValue("server1", "master");
        }


в результате 0, почему я же указал секцию и ключ, он мне должен вернуть значение ?, хотя как я прочитал GetPrivateProfileString возвращает только число скопированных символов --- это я не понимаю, что конкретно он возвращает и если я делаю не так, то плиз подскажите ошибку :(
Я не волшебник, я просто учусь.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Re: Как прочитать из ini файла ???

Сообщение VVitafresh » 23.12.2008 (Вт) 17:41

По примеру http://www.codeproject.com/KB/cs/cs_ini.aspx у меня все работает. Может быть нужно задать полный путь к файлу?
Код: Выделить всё
private void button1_Click(object sender, EventArgs e)
        {
            string FilePath = "D:\\sql.ini";
            IniFile ini = new IniFile(FilePath);
            Label1.Text=ini.IniReadValue("server1","master");
        }
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Re: Как прочитать из ini файла ???

Сообщение VVitafresh » 23.12.2008 (Вт) 17:51

Рекомендуют еще http://sourceforge.net/projects/nini среди прочих возможностей легко работает с ini файлами. Хотя сам не пользовался, просто делюсь доп. информацией.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Re: Как прочитать из ini файла ???

Сообщение dmitriy22 » 30.12.2008 (Вт) 16:49

сделал так и положил файл на диск C
но выходит ошибка
Код: Выделить всё
Warning: A StringBuilder buffer has been overflowed by unmanaged code.  The process may become unstable.  Insufficient capacity allocated to the StringBuilder before marshaling it.


что это значит ? я понимаю переполнение буфера, но почему у меня в файле всего 3 строчки...???
Я не волшебник, я просто учусь.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как прочитать из ini файла ???

Сообщение iGrok » 30.12.2008 (Вт) 16:59

dmitriy22 писал(а):
Код: Выделить всё
        {
            StringBuilder temp = new StringBuilder();
            string str=GetPrivateProfileString(Section,Key,"",temp,
                                            255, this.path).ToString();
            return temp.ToString();

        }
в результате 0, почему я же указал секцию и ключ, он мне должен вернуть значение ?, хотя как я прочитал GetPrivateProfileString возвращает только число скопированных символов --- это я не понимаю, что конкретно он возвращает и если я делаю не так, то плиз подскажите ошибку :(

Я могу ошибаться, на c# в жизни ничего не писал, но по моему у тебя буфер под результат не проинициализирован. Попробуй перед вызовом GetPrivateProfileString заполнять temp 255ю пробелами.
label:
cli
jmp label

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Re: Как прочитать из ini файла ???

Сообщение VVitafresh » 30.12.2008 (Вт) 17:19

Код: Выделить всё
            StringBuilder temp = new StringBuilder(255);


P.S. Возьми весь код с Code Project
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Re: Как прочитать из ini файла ???

Сообщение dmitriy22 » 30.12.2008 (Вт) 18:06

спасибо большое :)
да, надо будет почитать побольше...
Я не волшебник, я просто учусь.

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Re: Как прочитать из ini файла ???

Сообщение dmitriy22 » 06.01.2009 (Вт) 23:37

и еще забыл спросить, а какая функция возвращает не значения, а имена секций или ключей из ini файла ??? :(
Я не волшебник, я просто учусь.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как прочитать из ini файла ???

Сообщение iGrok » 07.01.2009 (Ср) 0:10

GetPrivateProfileSectionNames

Вообще, поищи по Get(/Write)PrivateProfile*
Может, ещё чего интересного для себя найдёшь.. )
label:
cli
jmp label

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Re: Как прочитать из ini файла ???

Сообщение dmitriy22 » 07.01.2009 (Ср) 1:47

iGrok писал(а):GetPrivateProfileSectionNames

Вообще, поищи по Get(/Write)PrivateProfile*
Может, ещё чего интересного для себя найдёшь.. )


спасибо, попробую покопаться :)
Я не волшебник, я просто учусь.

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Re: Как прочитать из ini файла ???

Сообщение dmitriy22 » 15.01.2009 (Чт) 18:04

Ну вот я продолжаю разбираться:
я пытаюсь записать в ComboBox список секций из ini файла
итак
я создал ini функцию
Код: Выделить всё
public class IniFile
        {
            public string path;
            [DllImport("kernel32")]
            private static extern int GetPrivateProfileSectionNames(StringBuilder retVal,
                int size, string filePath);


            public IniFile(string INIPath)
            {
                path = INIPath;
            }


            public string IniReadValue()
            {
                StringBuilder temp = new StringBuilder(255);
                int i = GetPrivateProfileSectionNames(temp, 255, this.path);
                return temp.ToString();

            }
        }

затем вызываю функцию записывая в combobox
Код: Выделить всё
        private void button1_Click(object sender, EventArgs e)
        {
            string path = "C:\\sql.ini";
            IniFile ini = new IniFile(path);
            comboBox1.Text = ini.IniReadValue();
        }

но здесь возвращается первое значение самая первая секция

вот а чтобы вернуть список, что-то не получается,.. я знаю SqlReader пока читает данные то я могу записать список, а вот как с API функцией ??? что-то ничего подходящего в инете не нашел :(
Я не волшебник, я просто учусь.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Как прочитать из ini файла ???

Сообщение Nord777 » 15.01.2009 (Чт) 19:58

Это потому, что возвращаемая строка разделена нулями.
Замени код в Button_Click:
Код: Выделить всё
   {
      string path = "C:\\sql.ini";
      IniFile ini = new IniFile(path);
      string txt = ini.IniReadValue();
      ComboBox1.Items.AddRange(txt.Split('\0'));
   }
И в API передавай не StringBuilder, а String. StringBuilder отсекает строку по нулю.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Re: Как прочитать из ini файла ???

Сообщение dmitriy22 » 16.01.2009 (Пт) 1:38

Nord777 писал(а):Это потому, что возвращаемая строка разделена нулями.
Замени код в Button_Click:
Код: Выделить всё
   {
      string path = "C:\\sql.ini";
      IniFile ini = new IniFile(path);
      string txt = ini.IniReadValue();
      ComboBox1.Items.AddRange(txt.Split('\0'));
   }
И в API передавай не StringBuilder, а String. StringBuilder отсекает строку по нулю.


в кнопке так сделал, а в классе ini поменял на String
Код: Выделить всё
          public string IniReadValue()
            {
               [b] char[] char_val = new char[20];
                String temp = new String(char_val);[/b]
                //int i = GetPrivateProfileString(Section,Key,"",temp,
                //                              255, this.path);
                int i = GetPrivateProfileSectionNames(temp, 255, this.path);
                return temp.ToString();

            }


но в итоге возвращается пустой список, что я не так сделал, может String не правильно объявил или char ??? :?:
Я не волшебник, я просто учусь.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как прочитать из ini файла ???

Сообщение iGrok » 16.01.2009 (Пт) 2:54

А что в i возвращается?
Тебе буфера-то хватает?

UPD:
А вообще, ты кажется опять забыл заполнить буфер символами.
Т.е. один-то ты символ даёшь (String temp = new String(char_val);), но этого явно мало.. Нужно как минимум 255 (столько ты передаёшь в значении размера буфера).
label:
cli
jmp label

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Как прочитать из ini файла ???

Сообщение Nord777 » 16.01.2009 (Пт) 6:58

у стринга есть конструктор, в который передаешь символ-заполнитель и число символов. И не надо возвращаемое значение преобразовывать в строку. Оно и так является строкой.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Как прочитать из ini файла ???

Сообщение Viper » 16.01.2009 (Пт) 8:49

dmitriy22, не забывай заполнять буфер достаточным количеством нуль-символов перед вызовом функции. Это, во-первых, а, во-вторых, после чтения дели полученную строку на отдельные имена, они разделены все теми же нуль-символами.
Весь мир матрица, а мы в нем потоки байтов!

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Re: Как прочитать из ini файла ???

Сообщение dmitriy22 » 16.01.2009 (Пт) 12:14

а можно на примере ? т.к. у меня возвращаются пустые значения, а i возвращает 197
и что за символ заполнитель ?
Я не волшебник, я просто учусь.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Как прочитать из ini файла ???

Сообщение Nord777 » 16.01.2009 (Пт) 21:01

Код: Выделить всё
   public string IniReadValue()
   {
      string temp = new String('\0', 1000);
      int i = GetPrivateProfileSectionNames(temp, temp.Length, this.path);
      return temp.Substring(0, i - 1);
   }

Правильное обьявление функции:
Код: Выделить всё
        [DllImport("kernel32", CharSet = CharSet.Auto)]
        private static extern int GetPrivateProfileSectionNames(String retVal, int size, string filePath);
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Re: Как прочитать из ini файла ???

Сообщение dmitriy22 » 17.01.2009 (Сб) 0:08

Спасибо :) до такого я сам долго бы доходил, к сожаленью опыта мало
и вот еще такой вопрос а ведь в буфере больше значений чем на самом деле и в массив передаются пустые строки, как с ними бороться, есть ли специальный метод ?
Я не волшебник, я просто учусь.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Как прочитать из ini файла ???

Сообщение Nord777 » 17.01.2009 (Сб) 14:24

а ведь в буфере больше значений чем на самом деле
Да, но лишнии значения отсекаются этой строкой:
Код: Выделить всё
return temp.Substring(0, i - 1);
Если у тебя в результате txt.Split('\0') остаются пустые значения, значит ты где то оказался невнимательным.
А вообще есть вариант функции Split, в которую можно передать константу RemoveEmptyEntries перечисления System.StringSplitOptions
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Как прочитать из ini файла ???

Сообщение Williams » 17.01.2009 (Сб) 15:24

[к слову о строках]
Мне кажется для таких операций больше подойдет StringBuilder.
И вы думаете, что вас оставят в живых после прочтения этого поста?

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Как прочитать из ini файла ???

Сообщение Nord777 » 17.01.2009 (Сб) 15:43

Williams писал(а):Мне кажется для таких операций больше подойдет StringBuilder.


Nord777 писал(а):И в API передавай не StringBuilder, а String. StringBuilder отсекает строку по нулю.

А возвращаемая строка имеет следующий формат:
Код: Выделить всё
Section1\0Section2\0Section3\0.....
Поэтому, используя StringBuilder мы будем получать всегда Section1
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

dmitriy22
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 121
Зарегистрирован: 27.04.2006 (Чт) 12:04
Откуда: Москва

Re: Как прочитать из ini файла ???

Сообщение dmitriy22 » 17.01.2009 (Сб) 16:40

Да, действительно StringBuilder возвращает только одну секцию
а с методом substring сейчас заработало :) спасибо :) , т.к. такое в книжках я не читал, а на работе никогда не надобно было...прям полтергейст какой-то вчера опять свой код досконально проверял эксперементировал и вот сейчас заработало....

я пока с этим API мучался, подумал ведь можно с ini работать через Stream как с обычным файлом ???..
Я не волшебник, я просто учусь.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Как прочитать из ini файла ???

Сообщение Nord777 » 17.01.2009 (Сб) 17:04

я пока с этим API мучался, подумал ведь можно с ini работать через Stream как с обычным файлом ???..
Странный вопрос. Конечно можно. Только "разбирать" файл придется самому.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


Вернуться в C#

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList