Problem mit iniRead

  • Guten Abend liebe Leute,

    Ich würde gerne ein Script machen welches mir ermöglicht die Accountkonten meiner Benutzer zu bearbeiten ( .ini ).
    Ich habe aber mit dem Auslesen der Konten Probleme...

    Hier ein Beispiel Script:

    Code
    [autoit]
    MsgBox(0,"",IniRead("ben.ini","","Key",""))
    [/autoit]

    Und hier mein Test Konto:
    https://autoit.de/www.workupload.com/file/T3Ze0WT

  • [autoit]


    MsgBox(0,"",IniRead("ben.ini","","Key",""))

    [/autoit]

    1. Der Pfad zur ini ist vermutlich nicht vollständig, bin mir jedenfalls nicht sicher was iniread tut wenn nur ein Dateiname anstatt eines kompletten Pfades angegeben wurde. besser wäre es in jedem Fall so:

    [autoit]


    $test = IniRead(@scriptdir & "\ben.ini","","Key","")
    ; oder eben der korrekte Pfad zur ini, z.b.
    $test = IniRead("C:\ben.ini","","Key","")

    [/autoit]

    2. Deine ini ist keine standardkonforme ini Datei. Eini ini muss immer Sektionen, Schlüssel und Werte haben, Schlüssel und Wert werden mit "=" getrennt, Sektionen mit "[]" umschlossen:

    Code
    [meinDaten]
    Key=Test
    Gebanntvon=??????????
    Bangrund=?????????
    Level=1
    AdminLevel=0
    ...usw...

    3. iniread erwartet eine standardkonforme ini wie oben beschrieben, ansonsten wird die Funktion beim parsen scheitern

    4. Da du ja scheinbar mehr als einen Account verwalten willst bietet es sich an, anstatt jedem user eine eigene ini zu geben jedem user eine ini Sektion zu geben:


    5. Um Redundanz zu vermeiden wäre eine CSV Struktur sinnvoller:

    Code
    Username,Key,Gebannt von,Bangrund,Level,AdminLevel,...
    Ben,Test,??????????,??????????,1,0,...
    Hans,Test2,...
    Georg,...
  • Der Game Server ( GTA San Andreas Multiplayer ) speichert die Accounts aber in .ini datein ohne Sektionsnamen... :S
    Aufgrund dessen war meine Frage ja auch ob es möglich ist den Sektionsnamen auszuschließen.

  • Der Game Server ( GTA San Andreas Multiplayer ) speichert die Accounts aber in .ini datein ohne Sektionsnamen... :S


    Du betreibst einen GTA San Andreas Multiplayer Server?

    Aufgrund dessen war meine Frage ja auch ob es möglich ist den Sektionsnamen auszuschließen.

    Ohne Sektionsnamen sind keine INI-Befehle anwendbar.

    mfg autoBert

  • Ja gibt es so z.B.:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiComboBox.au3>
    #include <StaticConstants.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Const $sIniPath = @ScriptDir & "\Test.ini"
    Const $sElect = "bitte einen KEY auswählen"
    Global $sValue
    $sLineSep = @LF
    $sRead = FileRead($sIniPath)
    $sRead = StringReplace($sRead,@CR,"") ;damit es sowohl mit @LF als auch mir @CRLF funktioniert
    $aRes = StringSplit($sRead, $sLineSep)
    ;~ _ArrayDisplay($aRes)
    Global $aINI[$aRes[0] + 1][2] = [[$aRes[0]]]
    For $i = 1 To $aRes[0] - 1
    $aTmp = StringSplit($aRes[$i], "=", 2)
    $aINI[$i][0] = $aTmp[0]
    $aINI[$i][1] = $aTmp[1]
    Next
    ;_ArrayDisplay($aINI)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUICreate("Account-Keys Editor", 300, 90, 302, 218)
    $idCboKey = GUICtrlCreateCombo("", 8, 8, 200, 25)
    If IsArray($aINI) Then
    For $i = 1 To $aINI[0][0]
    _GUICtrlComboBox_InsertString($idCboKey, $aINI[$i][0])
    Next
    EndIf
    _GUICtrlComboBox_InsertString($idCboKey, $sElect, 0)
    _GUICtrlComboBox_SetCurSel($idCboKey, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $idInpValue = GUICtrlCreateInput("", 213, 8, 80)
    $idBtnOK = GUICtrlCreateButton("&OK", 8, 33, 284)
    $idBtnSave = GUICtrlCreateButton("Account &speichern", 8, 60, 284)
    GUICtrlSetState($idBtnOK, $GUI_DISABLE)
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $idCboKey
    If GUICtrlRead($idCboKey) = $sElect Then
    GUICtrlSetState($idBtnOK, $GUI_DISABLE)
    Else
    GUICtrlSetState($idBtnOK, $GUI_ENABLE)
    GUICtrlSetData($idInpValue, _PseudoIniRead(GUICtrlRead($idCboKey)))
    EndIf
    Case $idBtnSave ;Werte zurück in Datei schreiben
    ;_ArrayDisplay($aINI)
    $hFile = FileOpen($sIniPath, 2)
    For $i = 1 To $aINI[0][0]
    FileWrite($hFile, $aINI[$i][0] & "=" & $aINI[$i][1] & @LF)
    Next
    FileClose($hFile)
    Case $idBtnOK
    _PseudoIniWrite(GUICtrlRead($idCboKey),GUICtrlRead($idInpValue))
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _PseudoIniRead($sKey) ;gibt den Wert zu einem KEY zurück
    Local $iPos = _ArraySearch($aINI, $sKey)
    ;ConsoleWrite("gefunden an: " & $iPos & ". Stelle" & @CRLF)
    If $iPos <> -1 And $aINI[$iPos][0] = $sKey Then
    Return $aINI[$iPos][1]
    Else
    SetError(-1)
    EndIf
    EndFunc ;==>_PseudoIniRead

    [/autoit] [autoit][/autoit] [autoit]

    Func _PseudoIniWrite($sKey,$sValue) ;schreibt einen Wert zu einem KEY ins Array KEINE SPEICHERUNG IN DATEI AN DIESER STELLE
    Local $iPos = _ArraySearch($aINI, $sKey)
    ;ConsoleWrite("gefunden an: " & $iPos & ". Stelle" & @CRLF)
    If $iPos <> -1 And $aINI[$iPos][0] = $sKey Then
    $aINI[$iPos][1]=$sValue
    Else
    SetError(-1)
    EndIf
    EndFunc

    [/autoit]

    mfg autoBert

  • Bei mir kommt jetzt eine Fehler meldung:

    Fehlermeldung:

    Code
    If _PseudoIniRead($sKey) = guictrlread($Input2) Then
    If ^ ERROR

    Teil der While schleife

    [autoit]


    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    For $i = 255 to 0 Step -15
    Sleep(50)
    WinSetTrans($WinMain,$WinMain,$i)
    Next
    Exit
    Case $Button1
    Global $size = WinGetPos($WinMain, $WinMain)
    _FTP_ProgressDownload($l_FTPSession,@Tempdir&"\ctf.ini",guictrlread($Input1)&".ini","_UpdateProgress")
    IniWrite(@userprofiledir&"\config.gta","Allgemein","Name",guictrlread($Input1))
    $sIniPath = @Tempdir&"\ctf.ini"
    $sKey = "Key"
    If _PseudoIniRead($sKey) = guictrlread($Input2) Then
    GUIDelete($WinMain)
    _StatistikenGUI()
    Else
    MsgBox(0,"","PW Falsch")
    EndIf
    EndSwitch
    WEnd
    EndFunc

    [/autoit]

    Hier die Funktion:

    [autoit]


    Func _PseudoIniWrite($sKey,$sValue) ;schreibt einen Wert zu einem KEY ins Array KEINE SPEICHERUNG IN DATEI AN DIESER STELLE
    Local $iPos = _ArraySearch($aINI, $sKey)
    ;ConsoleWrite("gefunden an: " & $iPos & ". Stelle" & @CRLF)
    If $iPos <> -1 And $aINI[$iPos][0] = $sKey Then
    $aINI[$iPos][1]=$sValue
    Else
    SetError(-1)
    EndIf
    EndFunc

    [/autoit]
  • Momment ich glaub ich habe die falsche Funktion eingefügt... :whistling:

    war mr klar dass _PseudoIniRead nich drinnen ist.

    Da die beiden DL-Quellen unterschiedliche Trennzeichen beim Zeilenende haben solltest du dir vor dem Hochladen eine Sicherung vom Original anlegen.

    mfg autoBert