Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Проверка существования секции в файле ini (http://forum.oszone.net/showthread.php?t=267717)

eus_deus 08-09-2013 22:29 2214761

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

Creat0R 08-09-2013 22:48 2214769

Код:

$sFileName = @ScriptDir & '\Test.ini'
$sSectName = 'Prefs'

$iExists = _IniSectionExists($sFileName, $sSectName)

If $iExists Then
    MsgBox(262144+64, 'OK!', 'Section [' & $sSectName & '] exists in file <' & $sFileName & '>')
ElseIf $iExists = -1 Then
    MsgBox(262144+48, 'Error!', 'File <' & $sFileName & '> was not found')
Else
    MsgBox(262144+48, 'Error!', 'There is no section [' & $sSectName & '] in file <' & $sFileName & '>')
EndIf

Func _IniSectionExists($sIniFile, $sSectionName)
    If Not FileExists($sIniFile) Then
        Return SetError(1, 0, -1)
    EndIf

    IniReadSection($sIniFile, $sSectionName)

    If @error = 1 Then
        Return 0
    EndIf

    Return 1
EndFunc


eus_deus 08-09-2013 22:56 2214777

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

Creat0R 09-09-2013 00:04 2214796

Цитата:

Цитата eus_deus
почитал и понял, что неверно немного поставил задачу - записываемая и проверяемая строка не должна существовать и должна быть уникальной по имени в файле »

Так в чём проблема, выше я дал функцию которая проверяет в файле существование ini секции, если секция не существует, то и писать не нужно.

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

Код:

$sFileName = @DesktopDir & '\Test.ini'
$sSectName = 'Prefs'

$sUniqueSectName = _IniSectGetUniqueName($sFileName, $sSectName)
MsgBox(64, 'Title', $sUniqueSectName) ;Это и будет новое (уникальное) имя несуществующей секции

Func _IniSectGetUniqueName($sIniFile, $sSectName, $sSep = '_')
    If Not FileExists($sIniFile) Then
        Return SetError(1, 0, $sSectName)
    EndIf

    Local $iC = 0
    Local $sOrigin_SectName = $sSectName
    Local $aSectNames = IniReadSectionNames($sIniFile)

    While 1
        For $i = 1 To UBound($aSectNames)-1
            If $aSectNames[$i] = $sSectName Then
                $iC += 1
                $sSectName = $sOrigin_SectName & $sSep & $iC
                ContinueLoop 2
            EndIf
        Next

        ExitLoop
    WEnd

    Return $sSectName
EndFunc


eus_deus 09-09-2013 13:47 2215008

Ошибся, поставив решенной. Итак, код у меня вышел такой, потом пояснения
Код:

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 2215026

Цитата:

Цитата eus_deus
имя секции - не [Default] »

В IniReadSection нужно передавать имя секции без скобок.

eus_deus 09-09-2013 14:27 2215031

Цитата:

Цитата eus_deus
$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 2215096

Цитата:

Цитата eus_deus
Default не доходит до inreadsection »

Значит $s_Sect равняется "[Default]", в условии указан Return, который завершает функцию.

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

eus_deus 09-09-2013 16:45 2215104

Creat0R, я ответил на ваш вопрос просто относительно квадратных скобок. С default все верно, так мне и надо. Не работает остальной код
Цитата:

Цитата eus_deus
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 2215128

Цитата:

Цитата eus_deus
Ввожу заведомо существующую секцию в текстовое поле ( просто для проверки) и получаю сообщение, что такой секции нет, а должен получать, что она есть »

Сообщает что нету потому что её нету.
Нужно проверять без скобок:
Код:

$iExists = _SectionExists($TFILE, StringRegExpReplace($s_Sect, '^\[|\]$', ''))
И вообще, не понятно что содержится в $Edit2, поэтому и написал...
Цитата:

Цитата Creat0R
Может лучше покажешь весь (рабочий) пример »


eus_deus 09-09-2013 17:35 2215133

Цитата:

Цитата Creat0R
Ввожу заведомо существующую секцию в текстовое поле ( просто для проверки) и получаю сообщение, что такой секции нет, а должен получать, что она есть »
Сообщает что нету потому что её нету. »

я ввожу на проверке имя секции, которая есть
Цитата:

Цитата Creat0R
Нужно проверять без скобок:
Код:
$iExists = _SectionExists($TFILE, StringRegExpReplace($s_Sect, '^\[|\]$', '')) »

в текстовом поле $Edit2 - секция записана со скобками, может и в коде со скобками надо? Хотя попробую
Цитата:

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

500 строк кода прислать? Тогда скорее всего вопросов будет больше

Creat0R, при проверке без скобок
Цитата:

Цитата eus_deus
$iExists = _SectionExists($TFILE, StringRegExpReplace($s_Sect, '^\[|\]$', '')) »

все именно ак, как и надо. Так я опять сталкиваюсь с регулярными выражениями, понять которые у меня не хватает ума. Осталось прописать события вместо сообщений, но это уже не по теме. Спасибо!

Creat0R 09-09-2013 21:17 2215247

Цитата:

Цитата eus_deus
в текстовом поле $Edit2 - секция записана со скобками, может и в коде со скобками надо? »

Нет, я же написал:
Цитата:

Цитата Creat0R
В IniReadSection нужно передавать имя секции без скобок. »

Почитай справку к функции.

Цитата:

Цитата eus_deus
Так я опять сталкиваюсь с регулярными выражениями »

Можно и без них:

Код:

$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 2215251

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


Время: 12:46.

Время: 12:46.
© OSzone.net 2001-