Запись в опред. строку секции INI файла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Creat0R
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 19
Зарегистрирован: 19.07.2006 (Ср) 2:51
Откуда: Univers://Earth.man

Запись в опред. строку секции INI файла

Сообщение Creat0R » 19.07.2006 (Ср) 4:08

Всем доброго времени суток!

Я только начинаю изучать программирование, и знаю лишь базисные понятия в нём, поэтому прошу учесть этот факт, при ответах на мои вопросы (если таковы будут :wink: )...

Вопрос у меня такой - мне нужно в файл параметров конфигурации (*.ini), в определённую (заранее известную) секцию, записать параметр+значение, но чтобы запись появилась не в начале или в конце заданной секции, а допустим, в третьей строке заданной секции.
Вот пример, как должна записаться строка с параметром и со значением (заданным), в определёную строку (в номер строки) заданной секции (где само название секции, будет ссчитаться как строка номер 0, ну, примерно так :) ) :

[Секция]
Тут параметр, неважно какой, его ненужно трогать - И он не обязательно первый по счёту в этой секции (т.е перед ним могут быть ещё параметры).
Тут тоже параметр, который ненужно трогать

Параметр = Значение ; Эта строка, это и есть то, что прописал (пропишет) скрипт.
Тут параметр, его не нужно трогать, и он не обязательно последний в этой секции...

Как можно такое осуществить средствами VBS? Хотя как я понял из прочтённых мной постов на подобные вопросы (из поиска, тут на форуме), данная задача наврядли реализуемая средствами одного лишь VBS, но мне в принципе не важно какими именно средствами, пусть даже будет запускаться какой-то модуль\класс (извените за невежество, просто я понятия не имею что требуется запускать) самим скриптом VBS, и тот модуль\класс уже будет делать что нужно.

Заранее благодарю всех кто сможет мне помочь! Очень и очень нужно! Изображение
CreatoR это не ник, CreatoR это стиль жизни!
Мой девиз - Умри, но будь!!!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.07.2006 (Ср) 6:44

Ну вообще можно выпендриться и заюзать регулярные выражения. Но можно и без них. Собственно тебе нужна процедура записи.

Теперь стандартный вопрос:
Что уже сделано? И что не получается?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Creat0R
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 19
Зарегистрирован: 19.07.2006 (Ср) 2:51
Откуда: Univers://Earth.man

Сообщение Creat0R » 19.07.2006 (Ср) 7:52

Хакер
Теперь стандартный вопрос:
Что уже сделано? И что не получается?

Ну, как сказать, на vbs у меня ничего не сделанно :( , но я сделал скрипт на AutoIt, и он определяет существует ли файл ini, и если да, то проверяет существование определённых параметров в заданной секции, а если те существуют, то удаляет их, а если нет...то, вот тут то и проблема - по идее, на этом этапе он должен записывать определённые параметры, в определённую строку заданной секции, но AutoIt'ом мне не удаётся это сделать (удаётся лишь поставить запись либо в начало секции, либо в конец - а нужно именно в заданную строку этой секции, например, в 3-тью строку этой секкции), а если хотябы сделать скрипт vbs, который и будет брать на себя эту задачу, то я просто буду его запускать когда нужно, из скрипта AutoIt'а.

P.S:
Вообще-то, этот 'проэкт', расчитан быть типа переключателем, который при первом его запуске, будет скрывать определённый пункт меню (в той программе которой пренадлежит ini файл), а после второго запуска, будет показывать его обратно (т.е пропиывать этот пункт в ini'шке).
CreatoR это не ник, CreatoR это стиль жизни!
Мой девиз - Умри, но будь!!!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.07.2006 (Ср) 8:22

А что такое, кстати, vbs?

По моим сведениям так называют сокращённо этот сайт.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 19.07.2006 (Ср) 8:36

Хакер писал(а):А что такое, кстати, vbs?

По моим сведениям так называют сокращённо этот сайт.


VBScript :lol:
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 19.07.2006 (Ср) 11:00

А так не подойдёт?

новый_текст_ini= Replace (текст_твоего_ini,"параметр=старое_значение","параметр=новое_значение")


Потом сохраняешь новый текст ini.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 19.07.2006 (Ср) 12:41

во блин, а до меня и не дошло что это vbscript :oops:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Creat0R
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 19
Зарегистрирован: 19.07.2006 (Ср) 2:51
Откуда: Univers://Earth.man

Сообщение Creat0R » 19.07.2006 (Ср) 14:04

keks-n писал(а):А так не подойдёт?

новый_текст_ini= Replace (текст_твоего_ini,"параметр=старое_значение","параметр=новое_значение")
Потом сохраняешь новый текст ini.

Не, :) , у меня же в файле кучю всяких секции с параметрами...
Нужно именно в существующий файл, в определённую строку секции (известную заранее, как номер строки, так и секции), записать параметр со значеним.

Я вот что думаю, может нужно расматривать файл не как ini, а как обычный текст-файл, в котором произвести поиск на нужную секцию (как на текст), затем, каким-то образом (мне не известным вовсе), назначить строку с секцией (т.е найденный текст) как первой в файле, а уже от неё и ориентироваться - в какой номер строки записывать нужный параметр со значением (и запись также пусть производится как в обычный текстовый файл, просто записать строчку целиком - параметр = значение).

Буду очень благодарен если сможете помочь сделать! Ну ООЧень нужно!
CreatoR это не ник, CreatoR это стиль жизни!
Мой девиз - Умри, но будь!!!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.07.2006 (Ср) 18:45

Считываешь построчно, сохраняя строки в строковый буфер, до тех пор, пока не встретится строка "[Секция]". После этого считываешь построчно, разделяя строку по символу "=" и сравнивая левую половину строки с "Параметр". Если сравнение успешно, то записываешь в буфер строку "Параметр = НовоеЗначение", в противном случае записываешь в буфер изначальную строку. И так до конца файла. После чего удаляешь файл и создаешь новый, записав в него данные из буфера.
Lasciate ogni speranza, voi ch'entrate.

Creat0R
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 19
Зарегистрирован: 19.07.2006 (Ср) 2:51
Откуда: Univers://Earth.man

Сообщение Creat0R » 19.07.2006 (Ср) 21:28

alibek
У меня файл ini, весит около 150 кб, и вот так весь его переписывать, думаю займёт много времени.
Мне не нужно записывать новое значение, значение и параметр должный быть опредеынымми мной (в скрипте). И даже если бы это и было нужным решением, я бы такое сделать не смог бы, не силён я в этом :( .
CreatoR это не ник, CreatoR это стиль жизни!
Мой девиз - Умри, но будь!!!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.07.2006 (Ср) 22:38

Ты ошибаешься, это займет доли секунды.
Lasciate ogni speranza, voi ch'entrate.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 20.07.2006 (Чт) 8:11

Если честно, то это просто бред. Для чёго такая функциональность? И на сколько она "устойчива"?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 20.07.2006 (Чт) 9:28

есть API функция для работы с ini файлами но ее названия я не помню :( так как никогда еще не приходилось пользоваться

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.07.2006 (Чт) 10:11

Неужели WritePrivateProfileString?
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 20.07.2006 (Чт) 11:16

shady
А как связаны VBScript и API?
Изображение

Creat0R
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 19
Зарегистрирован: 19.07.2006 (Ср) 2:51
Откуда: Univers://Earth.man

Сообщение Creat0R » 20.07.2006 (Чт) 14:07

Sebas писал(а):Если честно, то это просто бред. Для чёго такая функциональность? И на сколько она "устойчива"?


Ты спрашиваешь для чего мне нужно всё это?
Тогда отвечю - Дело в том, что эти параметры, это пункты меню в программе (Файл | Правка | Вид и т.д), которые нужно убирать\показывать при необходимости. Но для этого, нужно именно прописывать строчки в то место, где они и должный быть (я знаю заранее где), чтобы небыло путанницы в последовательности их появления в программе.
CreatoR это не ник, CreatoR это стиль жизни!
Мой девиз - Умри, но будь!!!

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 20.07.2006 (Чт) 19:54

Вас куда-то утянуло...
Всё гораздо проще: открываешь файл for random access и по записям пишешь/читаешь

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.07.2006 (Чт) 20:15

Читать INI по записям? оригинально.
Изображение

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 20.07.2006 (Чт) 20:28

а по-сути, какая разница, в каком виде его записывать, не обязательно же если ini - значит в текстовом режиме. Создать бд и читать/писать по записям. Все проблемы отпадут.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.07.2006 (Чт) 21:23

XPAHuTEJIb, знаешь, за последние два дня ты сказал довольно много ерунды.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.07.2006 (Чт) 21:29

XPAHuTEJIb

не обязательно же если ini - значит в текстовом режиме


Ну... тут под понятием INI имеется ввиду способ хранения данных а не расширение файла, где они хранятся.

А способ хранения предролагает, что данные хранятся в текстовом виде.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Re: Запись в опред. строку секции INI файла

Сообщение Nicky » 21.07.2006 (Пт) 6:46

Creat0R писал(а):...но мне в принципе не важно какими именно средствами, пусть даже будет запускаться какой-то модуль\класс (извените за невежество, просто я понятия не имею что требуется запускать) самим скриптом VBS, и тот модуль\класс уже будет делать что нужно...

Ну хочешь модуль на VB6? Доработаешь чтение ключей из командной строки - и вперед!

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 21.07.2006 (Пт) 7:06

GSerg
Не болтайте ерундой, товарищи! Я понимаю что вы Великие Гуру ВБ, но...Я предлагаю реальное решение данной проблемы, не подходит - пусть об этом скажет автор.

Ещё одно решение для текстового файла:
1. Все коменты пометить к.-либо символом (#коммент)
2. do until eof(1)
line input a(x)
x=x+1
loop
3. Проверяем первый символ на #
4. Изменяем динамический массив b(x,2) по количеству параметров.
5. Записываем в b(x,1) параметр, b(x,2) положение в массиве a
Т.О. Получаем два массива, один готов для записи в файл, второй можно менять как хочешь в пределах количества параметров. При изменении параметров массива b(x,y) изменять соответствующий параметр массива a. При закрытии программы - сбрасываем массив a в файл.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 21.07.2006 (Пт) 7:21

2XPAHuTEJIb"]
Чем это отличается от этого?

XPAHuTEJIb
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 12.07.2006 (Ср) 15:04
Откуда: Новый Уренгой

Сообщение XPAHuTEJIb » 21.07.2006 (Пт) 8:08

более конкретизировал. Вот код:
Код: Выделить всё
Dim a()
Dim b()

x = 0: y = 0
'сначала проверяем кол-во строк
Open "c:\options.ini" For Input As #1
Do Until EOF(1)
  'считаем строки
  x = x + 1
  Line Input #1, tmpString
  'считаем параметры
  If Left$(tmpString, 1) <> "#" Then y = y + 1
Loop
Close #1

'изменяем массивы
ReDim a(x), b(y, 2)

x = 0: y = 1
'загружаем данные в массив
Open "c:\options.ini" For Input As #1
Do Until EOF(1)
  x = x + 1
  Line Input #1, a(x)
'пишем параметры в массив b
  If Left$(a(x), 1) <> "#" Then
   b(y, 1) = a(x)
   b(y, 2) = x
   y = y + 1
  End If
Loop
Close #1
'Дальше всё зависит от твоей фантазии

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.07.2006 (Пт) 8:16

ой немогу я больше смотреть на это.

вобщем есть такая библа
Microsoft VBScript Regular Expression.
Я почему то уверено что до неё можно достучаться из vbscript

Ну а если можно, вот
Код: Выделить всё

Function ChangeIniVal(inpText, secname, paramname, newval)
Dim regexp As New regexp
regexp.MultiLine = True
regexp.Pattern = "(\[" + secname + "\]((.)*\r\n)*)(\b" + paramname + "\b\40*=\40*)(\w+)"
ChangeIniVal = regexp.Replace(inpText, "$1$4" & newval)
If Not regexp.Test(ChangeIniVal) Then
regexp.Pattern = "(\[" + secname + "\])"
ChangeIniVal = regexp.Replace(inpText, "$1" + vbNewLine & paramname & "=" & newval)
End If
End Function


Поменять только строчку Dim regexp As New regexp
надо на ту что создаёт объект класса RegExp

И вот вам готово волшебное средство под названием регулярные выражения :wink:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

shady
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 09.11.2005 (Ср) 11:03

Сообщение shady » 21.07.2006 (Пт) 11:17

keks-nда, что-то я упустил из виду что автор спрашивал про VBS. :?


Вернуться в Visual Basic 1–6

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

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

    TopList