:: Visual Foxpro, Foxpro for DOS
Ini файлы
AdamAry

Сообщений: 843
Дата регистрации: 14.12.2015
Всем привет.

1. Как лучше работать с ini файлами в VFP 8?
2. Какой самый оптимальный способ закидывания содержимого ini в курсор?



Исправлено 1 раз(а). Последнее : AdamAry, 17.02.17 08:40
Ratings: 0 negative/0 positive
Re: Ini файлы
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
Каков вопрос, то и ...
APPEND MEMO MemoFieldName FROM FileName[OVERWRITE] [AS nCodePage]
Ratings: 0 negative/2 positive
Re: Ini файлы
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
*-- API32-functions for INI-files **************************************
DECLARE Integer WritePrivateProfileString IN WIN32API as WritePrivStr ;
String cSection, ; && Имя раздела
String cKey, ; && Имя реквизита
String cValue, ; && Значение реквизита
String posfile && Имя INI-файла с полным путем доступа
DECLARE Integer GetPrivateProfileString IN WIN32API as GetPrivStr ;
String cSection, ; && Имя раздела
String cKey, ; && Имя реквизита
String cDefault, ; && Значение по умолчанию
String @CBufer, ; && Считанное значение реквизита
Integer nBufferSize, ; && Макс. число симоволов в счит. реквизите
String posfile && Имя INI-файла с полным путем доступа
*************************************************************************


------------------
Ratings: 0 negative/3 positive
Re: Ini файлы
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
1) см. ответ от Аспид, не забывая, что при передаче строковых параметров в объявленные функции нужно к строкам добавить символ chr(0), а при вызове GetPrivateProfileString параметр cFufer должен передаваться по ссылке и предварительно инициализирован строкой достаточной длины. Например,

lcFile = '..\myinifile.ini' + chr(0)
lcBufer = repli( ' ', 256 )
lcSection = 'MySection' + chr(0)
lcKey = 'MyKey' + chr(0)
n = GetPrivStr( m.lcSection, m.lcKey, "", @lcBufer, 255, m.lcFile)
if m.n>0
lcResult = left( m.lcBufer, m.n )
else
* что-то пошло не так
endif

2) Нельзя ответить, не зная какая конкретно структура вашего ini-файла и требуемого результата (структуры курсора)
Если речь о том, чтобы перенести содержательные строки файла в строки курсора, разделив имена секций, ключей и значения, при этом заранее не зная структуру, то придется разбирать файл самостоятельно, анализируя каждуй строку в отдельности.
Ratings: 0 negative/1 positive
Re: Ini файлы
tandem

Сообщений: 16
Дата регистрации: 25.05.2008
* Забираем данные ини файла в курсор для дальнейшей обработки.
inifile=Getfile('INI')
If ini_to_cursor(iniFile)
browse
Endif
Return .T.
*********************************************
* Function ini_to_cusor(iniFileName)
*********************************************
Function ini_to_cursor
Lparameters lcFileName
If Parameters( )=0
Messagebox('Не найден параметр {lcFileName.ini}')
Return .F.
Endif
If !File(lcFileName)
Messagebox('Не найден файл:'+Chr(10)+Chr(13)+lcFileName)
Return .F.
Endif
Local m.lcini,m.lRet, m.lcBuffer,m.lcStrok, m.lcSection,m.lckey,m.lcValue,m.lcComment,m.Strlen,m.AtNum
m.lcini=Juststem(lcFileName)
m.lRet=Chr(10)
m.lcBuffer=m.lRet+Filetostr(lcFileName)
m.lcStrok=''
m.lcSection=''
m.lckey=''
m.lcValue=''
m.lcComment=''
m.Strlen=0
m.AtNum=0
* Создаём курсор.
Create Cursor &lcini(lcini c(32),lcSection c(32),lckey c(32),lcValue c(64),lcComment c(254))
* Анализируем построчно разделитель m.lRet=Chr(10).
For m.lnI = 1 To Occurs(m.lRet,m.lcBuffer)-1
m.lcValue=''
lnFromPos = At(m.lRet,m.lcBuffer,m.lnI)
lnToPos = At(m.lRet,m.lcBuffer,m.lnI+1)
m.lcStrok=Substr(m.lcBuffer,m.lnFromPos+1,m.lnToPos-m.lnFromPos-1)
m.Strlen=Len(m.lcStrok)
* Номер позиции знака ';' в строке.
m.AtNum=At(';',m.lcStrok,1)
If m.AtNum>0
* Убираем и запоминаем коментарий за знаком ';'
m.lcComment=Alltrim(Substr(m.lcStrok,m.AtNum+1,m.Strlen-m.AtNum+1))
m.lcStrok=Left(m.lcStrok,m.AtNum-1)
m.Strlen=Len(m.lcStrok)
Else
m.lcComment=''
Endif
If Left(m.lcStrok,1)='['
m.lcSection=Alltrim(Left(m.lcStrok,At(']',m.lcStrok,1)))
Else
* Номер позиции знака '=' в строке.
m.AtNum=At('=',m.lcStrok,1)
If m.AtNum>0
* До знака '=' в переменную ключ.
m.lckey=Alltrim(Left(m.lcStrok,m.AtNum-1))
* После знака '=' в переменную Значение.
m.lcValue =Alltrim(Substr(m.lcStrok,m.AtNum+1,m.Strlen-m.AtNum+1))
Endif
Endif
If Len(m.lcValue)>0
*?"Секция "+m.lcSection,"Ключ "+m.lckey,"Значение "+m.lcValue,"Коментарий "+m.lcComment
Append Blank
Gather Memvar
Endif
Endfor
Return .T.
Endfunc



Исправлено 2 раз(а). Последнее : tandem, 17.02.17 12:52
Ratings: 0 negative/1 positive
Re: Ini файлы
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
На самом деле начиная с 7 или 8 версии фокса (может и раньше, про антиквариат я не помню ) добавлять CHR(0) в конец строк не требуется - фокс сам добавляет один ноль. Вот для функций работающих с Unicode строками это по прежнему необходимо - т.к. фокс только один chr(0) добавляет, а для юникодных строк нужна пара.
Помимо указанных функций, которые используются для считывания ИЗВЕСТНЫХ ключей (как правило ini файлы хранят настройки приложения, и все ключи и секции в них известны), есть ещё
DECLARE INTEGER GetPrivateProfileSectionNames IN WIN32API ;
STRING @ lpszReturnBuffer, ;
INTEGER nSize, ;
STRING lpFileName
DECLARE INTEGER GetPrivateProfileSection IN WIN32API ;
STRING lpAppName, ;
STRING @ lpReturnedString, ;
INTEGER nSize, ;
STRING lpFileName
Которые позволяют разбирать "неизвестные" ini файлы - но там реально много кода придётся писать - почти как для ручного разбора.

Преимущество АПИ функций по сравнению с "ручным" разбором (наподобии кода tandem) ещё и в том, что они учитывают "виртуализацию" ini файлов в реестре (была такая мулька в MS - они вынесли данные из всех "антикварных" ini файлов типа win.ini, system.ini, control.ini в реестр, хитрО там всё прописав в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping, а чтобы ОЧЕНЬ старые программы не сломались, добавили в данные АПИ функции виртуализацию - вроде как читаешь из ini файла, а на самом деле идёт обращение к реестру).
Впрочем, ни то ни другое (ни системные ini файлы, ни реестр) уже давно НЕ является рекомендованным способом хранения настроек


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Ini файлы
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Igor Korolyov
может и раньше, про антиквариат я не помню
В 6-ке точно нужно было. Код с тех пор кочует... Про автодобавление нуля не знал - век живи, век учись ))

Igor Korolyov
НЕ является рекомендованным способом хранения настроек
От того, что он не рекомендованный, он не стал менее удобным для хранения всяких локальных настроек, типа положения окон, последних использованных значений, путей к БД и т.п. По крайней мере я так и не придумал, зачем бы мне нужен был реестр - хватало ini, плюс метаданные в БД для тех настроек, которые не должны быть привязаны к машине. Поэтому так и не удосужился разобраться, как с реестром работать, а теперь, видимо, и не актуально Что, кстати, теперь является идеологически верным?
Ratings: 0 negative/1 positive
Re: Ini файлы
tandem

Сообщений: 16
Дата регистрации: 25.05.2008
ini файл удобно редактировать на серверном ресурсе.
Смена пути к базам при переносе на другие носители.
Проверка и обновление версий модулей и библиотек.
Секция [UPDATE] или [ОБНОВИТЬ]
myapp1.exe=server/myappdir/myapp1.exe
myapp2.exe=server/myappdir/myapp2.exe
myapp3.exe=server/myappdir/myapp3.exe
и т.п.
Ratings: 0 negative/1 positive
Re: Ini файлы
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
В корне фокса есть папка FFC. В ней библа, в которой пять классов.
Как раз для ini-файлов, реестра, файловых ассоциаций, ODBC и чего-то еще.
Ratings: 0 negative/1 positive
Re: Ini файлы
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Там как раз обёртка над этими АПИ функциями и есть. Но сам класс тащить в свой проект IMHO перебор...


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Ini файлы
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
Igor Korolyov
Там как раз обёртка над этими АПИ функциями и есть. Но сам класс тащить в свой проект IMHO перебор...

Я в курсе.
Но как ни крути, а инфы по чтению/записи в ini-файл там поболее и подробнее, чем здесь написали.
Тем более, вполне закономерно, что через некоторое время ТС и про реестр начнет спрашивать. Тенденция такова.

А тащить в свой проект?
1. Т.е. писать все с нуля, черпая здесь по ложке это лучше? (По крайней мере неделя разговоров здесь про ini-файл меня убьет , особенно ежели опять как с переменными - все тащить в курсор.)
2. Сформировать PRG с Custom классом на основе существующего класса. Комменты проставить для себя и разобраться с вполне самодостаточным классом.
Ratings: 0 negative/1 positive
Re: Ini файлы
lulgu
Автор

Сообщений: 1838
Дата регистрации: 30.11.2016
Вряд ли с Winapi стоит ориентироваться на подобные решения. Проект лопнет.
В обертках все решается.
И начинать нужно со структур.

UPD. На глазок все-таки прикинул:
В текстовом виде обертки Winapi в объеме сайта news2news "весят" около 200 кб, Gdip в объеме примера от Клепенина - 16 кб. Структуры - "на все случаи жизни" можно оставить порядка 150 кб.



Исправлено 3 раз(а). Последнее : lulgu, 18.02.17 14:19
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 24 (Гостей: 24)

© 2000-2024 Fox Club 
Яндекс.Метрика