Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с ини файлом / 5 сообщений из 5, страница 1 из 1
18.05.2014, 09:54
    #38644377
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с ини файлом
у меня есть ини файл, если кто не знаком, то структура его такая:
Код: sql
1.
2.
3.
4.
5.
6.
7.
[Section1]
Key1=Value
Key2=Value
[Section2]
Key1=Value
Key2=Value
и так далее.


и у меня есть класс который считывает/записывает значение в заданной секции по заданному ключу, кроме того я могу получить список всех секций, и список всех ключей в заданной секции.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
 class IniFile
    {
        [DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileStringW",
          SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
          private static extern int GetPrivateProfileString(
          string lpSection,
          string lpKey,
          string lpDefault,
          string lpReturnString,  //StringBuilder lpReturnString,
          int nSize,
          string lpFileName);

        [DllImport("KERNEL32.DLL", EntryPoint = "GetPrivateProfileStringW",
          SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        private static extern int GetPrivateProfileString(
        string lpSection,
        string lpKey,
        string lpDefault,
        StringBuilder lpReturnString,
        int nSize,
        string lpFileName);

        [DllImport("KERNEL32.DLL", EntryPoint = "WritePrivateProfileStringW",
          SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
          private static extern int WritePrivateProfileString(
          string lpSection,
          string lpKey,
          string lpValue,
          string lpFileName);

       private string _path = "";
       public string Path
       {
            get
            {
                return _path;
            }
            set
            {
                if (!File.Exists(value))
                    File.WriteAllText(value, "", Encoding.Unicode);
                _path = value;
            }
        }

        public IniFile(string INIPath)
        {
            this.Path = INIPath;
        }

        public void IniWriteValue(string Section, string Key, string Value)
        {
            WritePrivateProfileString(Section, Key, Value, this.Path);
        }

        public string IniReadValue(string Section, string Key)
        {
            const int MAX_CHARS = 1023;
            StringBuilder result = new StringBuilder(MAX_CHARS);
            GetPrivateProfileString(Section, Key, "", result, MAX_CHARS, this.Path);
            return result.ToString();
        }

        public string GetIniFileString(string category, string key, string defaultValue)
        {
           string returnString = new string(' ', 1024);
           GetPrivateProfileString(category, key, defaultValue, returnString, 1024, this.Path);
           return returnString.Split('\0')[0];
        }

        public List<string> GetCategories(string iniFile)
        {
            string returnString = new string(' ', 65536);
            GetPrivateProfileString(null, null, null, returnString, 65536, iniFile);
            List<string> result = new List<string>(returnString.Split('\0'));
            result.RemoveRange(result.Count - 2, 2);
            return result;
        }

        public /*static*/ List<string> GetKeys(string iniFile, string category)
       {
           string returnString = new string(' ', 32768);
           GetPrivateProfileString(category, null, null, returnString, 32768, iniFile);
           List<string> result = new List<string>(returnString.Split('\0'));
           result.RemoveRange(result.Count-2,2);
           return result;
        }

    }



мне надо расширить функциональность класса:
1. добавлять/удалять секции
2. добавлять/удалять ключи в заданной секции.
я понимаю, что это не архисложная задача, но алгоритмист я пока плохой.
хотелось послушать знающих товарищей как эффективно добавить эти функции.
...
Рейтинг: 0 / 0
18.05.2014, 10:38
    #38644385
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с ини файлом
jenya7,
вы как то странно, стырили где то код, а как он работает не разобрались, или поленились
согласно вашей спецификации:
IniFile ff=new IniFile(блабла);//открывает или создает файл

ff.IniWriteValue("s","к","100"); создает секцию s ( если ее нет) , создает ключ если его нет

ff.IniWriteValue("s",null,null); удаляет секцию s ( если она есть )

ff.IniWriteValue("s","k",null); удаляет из секции ключ к если он существует
...
Рейтинг: 0 / 0
18.05.2014, 11:36
    #38644394
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с ини файлом
большое спасибо! код действительно стырил.
я не знал что если передать в WritePrivateProfileString аргумен null ф-ция затирает секцию/ключ.
...
Рейтинг: 0 / 0
18.05.2014, 11:55
    #38644398
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с ини файлом
работает! :) а не подскажете как можно отсортировать секции в файле по имени секции?
...
Рейтинг: 0 / 0
19.05.2014, 12:19
    #38645026
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с ини файлом
решил сортировать так
сначала загоняю файл в массив:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
 public List<string> LoadIniFileToStructure(string file)
       {
           List<string> buffer = new List<string>();
           StreamReader sr = new StreamReader(file);
           string strline = "";
           //string ini_record = "";
           string section = "";
           string key = "";
           {
               using (sr)
               {
                   while (!sr.EndOfStream)
                   {
                       strline = sr.ReadLine();
                       //find section
                       if (IsSection(strline))
                       {
                           //if there is a previous record - store it
                           if (!string.IsNullOrEmpty(section))
                           {
                               buffer.Add(section + key);
                               //section = "";
                               key = "";
                           }
                           //record section
                           section = strline + "\r";
                       }
                       else
                       {
                           if (IsValidKey(strline))
                                key += strline + "\r";
                           else
                               key += strline + " is invalid key\r";
                       }
                   }
               }
           }
           return buffer;
       }


на выходе вижу красивый ини файл
потом сортирую и записываю обратно в файл:
Код: c#
1.
2.
3.
List<string> data = LoadIniFileToStructure(ini_file);
data.Sort(); //тут все красиво 
File.WriteAllLines(Globals.IniFilePath, data.ToArray()); //а вот тут эта падла убирает все "\r"


проблема что при записи убираются все "\r" и весь файл записывается сплошным куском.
причем я перепробывал все методы записи какие есть у класса File.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Работа с ини файлом / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]