PDA

Показать полную графическую версию : [решено] Проверка существования секции в файле ini


eus_deus
08-09-2013, 22:29
Привет! Логически вроде просто, но сообразить не могу. Итак, в текстовом поле составляется секция ini файла с параметрами. По нажатию кнопки содержание текстового поля должно записываться в этот ini файл. Как проверить имя секции на уникальность и предупредить пользователя, если имя совпадает?

Creat0R
08-09-2013, 22:48
$sFileName = @ScriptDir (http://autoit-script.ru/autoit3_docs/macros.htm#@scriptdir) & '\Test.ini'
$sSectName = 'Prefs'

$iExists = _IniSectionExists($sFileName, $sSectName)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iExists Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://autoit-script.ru/autoit3_docs/functions/MsgBox.htm)(262144+64, 'OK!', 'Section [' & $sSectName & '] exists in file <' & $sFileName & '>')
ElseIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#ElseIf) $iExists = -1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
MsgBox (http://autoit-script.ru/autoit3_docs/functions/MsgBox.htm)(262144+48, 'Error!', 'File <' & $sFileName & '> was not found')
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
MsgBox (http://autoit-script.ru/autoit3_docs/functions/MsgBox.htm)(262144+48, 'Error!', 'There is no section [' & $sSectName & '] in file <' & $sFileName & '>')
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _IniSectionExists($sIniFile, $sSectionName)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) FileExists (http://autoit-script.ru/autoit3_docs/functions/FileExists.htm)($sIniFile) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://autoit-script.ru/autoit3_docs/functions/SetError.htm)(1, 0, -1)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

IniReadSection (http://autoit-script.ru/autoit3_docs/functions/IniReadSection.htm)($sIniFile, $sSectionName)

If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://autoit-script.ru/autoit3_docs/macros.htm#@error) = 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 0
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) 1
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

eus_deus
08-09-2013, 22:56
Да, почитал и понял, что неверно немного поставил задачу - записываемая и проверяемая строка не должна существовать и должна быть уникальной по имени в файле. Хотя может я что торможу...Время то позднее

Creat0R
09-09-2013, 00:04
почитал и понял, что неверно немного поставил задачу - записываемая и проверяемая строка не должна существовать и должна быть уникальной по имени в файле »
Так в чём проблема, выше я дал функцию которая проверяет в файле существование ini секции, если секция не существует, то и писать не нужно.

Если речь идёт о присвоении секции нового, уникального имени, то можно сделать так:

$sFileName = @DesktopDir (http://autoit-script.ru/autoit3_docs/macros.htm#@desktopdir) & '\Test.ini'
$sSectName = 'Prefs'

$sUniqueSectName = _IniSectGetUniqueName($sFileName, $sSectName)
MsgBox (http://autoit-script.ru/autoit3_docs/functions/MsgBox.htm)(64, 'Title', $sUniqueSectName) ;Это и будет новое (уникальное) имя несуществующей секции

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _IniSectGetUniqueName($sIniFile, $sSectName, $sSep = '_')
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) FileExists (http://autoit-script.ru/autoit3_docs/functions/FileExists.htm)($sIniFile) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://autoit-script.ru/autoit3_docs/functions/SetError.htm)(1, 0, $sSectName)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)

Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $iC = 0
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $sOrigin_SectName = $sSectName
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aSectNames = IniReadSectionNames (http://autoit-script.ru/autoit3_docs/functions/IniReadSectionNames.htm)($sIniFile)

While (http://www.autoitscript.com/autoit3/docs/keywords.htm#While) 1
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) UBound (http://autoit-script.ru/autoit3_docs/functions/UBound.htm)($aSectNames)-1
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $aSectNames[$i] = $sSectName Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$iC += 1
$sSectName = $sOrigin_SectName & $sSep & $iC
ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop) 2
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)

ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
WEnd (http://www.autoitscript.com/autoit3/docs/keywords.htm#WEnd)

Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $sSectName
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

eus_deus
09-09-2013, 13:47
Ошибся, поставив решенной. Итак, код у меня вышел такой, потом пояснения
Func _prov_unik()
$TFILE=@ScriptDir&'/Setting.ini')
$s_Sect=_GUICtrlEdit_GetLine($Edit2, 0)
If $s_Sect="[Default]" Then
MsgBox(4096, "Ошибка ", "Переименуйте секцию " & $s_Sect )
Return
EndIf
$iExists = _SectionExists($TFILE, $s_Sect)
If $iExists Then
MsgBox(262144+48, 'Ошибка!', 'Секция ' & $s_Sect & ' уже есть в файле ' & $TFILE )
ElseIf $iExists = -1 Then
MsgBox(262144+48, 'Ошибка!', 'Файл' & $TFILE & ' не найден')
Else
MsgBox(262144+64, 'Error!', 'There is no section ' & $s_Sect & ' in file <' & $TFILE & '>')
EndIf
EndFunc

Func _SectionExists($TFILE, $s_Sect)
$TFILE=@ScriptDir&'/Setting.ini')
$s_Sect=_GUICtrlEdit_GetLine($Edit2, 0)
If Not FileExists($TCMFILE) Then
Return SetError(1, 0, -1)
EndIf
IniReadSection($TCMFILE, $s_Sect)
If @error = 1 Then
Return 0
EndIf
Return 1
EndFunc

Собственно - задача. имя секции, которая стоит в первой строке Edit2, считывается функцией _GUICtrlEdit_GetLine($Edit2, 0). При записи нужна проверка, что секция с таким именем не существует в файле $TFILE=@ScriptDir&'/Setting.ini') и что имя секции - не [Default] (условие этого в коде есть). Понимаю, что выношу всем мозг своим тупизмом, но научится то хочется...

Creat0R
09-09-2013, 14:15
имя секции - не [Default] »
В IniReadSection нужно передавать имя секции без скобок.

eus_deus
09-09-2013, 14:27
$s_Sect=_GUICtrlEdit_GetLine($Edit2, 0)
If $s_Sect="[Default]" Then
MsgBox(4096, "Ошибка ", "Переименуйте секцию " & $s_Sect )
Return
EndIf »

Default не доходит до inreadsection

Creat0R
09-09-2013, 16:38
Default не доходит до inreadsection »
Значит $s_Sect равняется "[Default]", в условии указан Return, который завершает функцию.

Может лучше покажешь весь (рабочий) пример, чтобы было видно где ошибка и что требуется?

eus_deus
09-09-2013, 16:45
Creat0R, я ответил на ваш вопрос просто относительно квадратных скобок. С default все верно, так мне и надо. Не работает остальной кодFunc _prov_unik()
$TFILE=@ScriptDir&'/Setting.ini')
$s_Sect=_GUICtrlEdit_GetLine($Edit2, 0)
If $s_Sect="[Default]" Then
MsgBox(4096, "Ошибка ", "Переименуйте секцию " & $s_Sect )
Return
EndIf
$iExists = _SectionExists($TFILE, $s_Sect)
If $iExists Then
MsgBox(262144+48, 'Ошибка!', 'Секция ' & $s_Sect & ' уже есть в файле ' & $TFILE )
ElseIf $iExists = -1 Then
MsgBox(262144+48, 'Ошибка!', 'Файл' & $TFILE & ' не найден')
Else
MsgBox(262144+64, 'Error!', 'There is no section ' & $s_Sect & ' in file <' & $TFILE & '>')
EndIf
EndFunc
Func _SectionExists($TFILE, $s_Sect)
$TFILE=@ScriptDir&'/Setting.ini')
$s_Sect=_GUICtrlEdit_GetLine($Edit2, 0)
If Not FileExists($TCMFILE) Then
Return SetError(1, 0, -1)
EndIf
IniReadSection($TCMFILE, $s_Sect)
If @error = 1 Then
Return 0
EndIf
Return 1
EndFunc »
Ввожу заведомо существующую секцию в текстовое поле ( просто для проверки) и получаю сообщение, что такой секции нет, а должен получать, что она есть

Creat0R
09-09-2013, 17:29
Ввожу заведомо существующую секцию в текстовое поле ( просто для проверки) и получаю сообщение, что такой секции нет, а должен получать, что она есть »
Сообщает что нету потому что её нету.
Нужно проверять без скобок:
$iExists = _SectionExists($TFILE, StringRegExpReplace($s_Sect, '^\[|\]$', ''))

И вообще, не понятно что содержится в $Edit2, поэтому и написал...
Может лучше покажешь весь (рабочий) пример »

eus_deus
09-09-2013, 17:35
Ввожу заведомо существующую секцию в текстовое поле ( просто для проверки) и получаю сообщение, что такой секции нет, а должен получать, что она есть »
Сообщает что нету потому что её нету. »
я ввожу на проверке имя секции, которая есть
Нужно проверять без скобок:
Код:
$iExists = _SectionExists($TFILE, StringRegExpReplace($s_Sect, '^\[|\]$', '')) »
в текстовом поле $Edit2 - секция записана со скобками, может и в коде со скобками надо? Хотя попробую
Может лучше покажешь весь (рабочий) пример, чтобы было видно где ошибка и что требуется? »
500 строк кода прислать? Тогда скорее всего вопросов будет больше

Creat0R, при проверке без скобок
$iExists = _SectionExists($TFILE, StringRegExpReplace($s_Sect, '^\[|\]$', '')) »
все именно ак, как и надо. Так я опять сталкиваюсь с регулярными выражениями, понять которые у меня не хватает ума. Осталось прописать события вместо сообщений, но это уже не по теме. Спасибо!

Creat0R
09-09-2013, 21:17
в текстовом поле $Edit2 - секция записана со скобками, может и в коде со скобками надо? »
Нет, я же написал:
В IniReadSection нужно передавать имя секции без скобок. »
Почитай справку к функции.

Так я опять сталкиваюсь с регулярными выражениями »
Можно и без них:

$iExists = _SectionExists($TFILE, StringTrimRight(StringTrimLeft($s_Sect, 1), 1))

или

$iExists = _SectionExists($TFILE, StringMid($s_Sect, 2, StringLen($s_Sect) - 2))

Но с рег. выражениями всё же надёжнее.

eus_deus
09-09-2013, 21:21
Creat0R, спасибо, все работает с регулярными, менять не стану. Просто надо взять себя в руки и хоть немного им поучиться, а то у меня снова еще одна функция без них не идет. Код мне скинули по аське, но он что то не пашет (пора уже привыкнуть). Но это уже другая история




© OSzone.net 2001-2012