Mehrdimensionales Array aus Datei und wieder hinein!?

  • Hey Leute ich habe folgendes Problem, ich möchte mit diesem GUI
    die URL und den Dateinamen in ein 2 dimensionales Array laden und in die Datei "beschreibungen.ini" speichern

    die bezeichnung soll in ein Array gespreichert werden und in die datei "names.ini"

    es soll aber so sein, dass ich beide zusammen aufrufen kann, da sie ja zusammengehören (name -> url -> dateiname)

    Hier mal mein Code, der aber leider nicht wirklich funktioniert :(


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

    #include <Array.au3>
    #include <File.au3>
    #include <GUIConstants.au3>

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

    $download_add = GUICreate("Download hinzufügen", 553, 124, 205, 192)
    $url = GUICtrlCreateInput("url", 64, 8, 425, 21)
    $bezeichnung = GUICtrlCreateInput("bezeichnung", 64, 40, 425, 21)
    $speichern = GUICtrlCreateButton("speichern", 200, 96, 145, 25, 0)
    $dateiname = GUICtrlCreateInput("dateiname", 64, 72, 425, 21)
    GUISetState(@SW_SHOW)

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

    Dim $names

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

    _FileReadToArray("names.ini", $names)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $speichern

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

    $file55 = "beschreibungen.ini"
    Local $CountLines = _FileCountLines($file55)
    Local $zeile
    $csv = FileOpen($file55, 0)
    For $i = 1 To $CountLines
    $zeile = FileReadLine($csv, $i)
    If @error = -1 Then ExitLoop
    Dim $neues = 0
    $neues = $neues +1
    Next

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

    $file = "beschreibungen.ini"
    Local $CountLines = _FileCountLines($file)
    Local $zeilen1[$CountLines + 1][2]
    Local $zeile
    $zeilen1[0][0] = $CountLines
    $csv = FileOpen($file, 0)
    For $i = 1 To $CountLines
    $zeile = FileReadLine($csv, $i)
    If @error = -1 Then ExitLoop
    $zeilen1[$i][0] = $i
    $zeilen1[$i][1] = StringSplit($zeile, ",")
    MsgBox(64, "Test", "Nr(Zeile): " & $zeilen1[$i][0])
    _ArrayDisplay( $zeilen1[$i][1])
    Next
    FileClose($csv)

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

    _ArrayAdd( $names,$bezeichnung)
    _ArrayAdd( $zeilen1[$neues][0],$url)
    _ArrayAdd( $zeilen1[$neues][1],$dateiname)
    _FileWriteFromArray("beschreibungen.ini", $zeilen1)
    _FileWriteFromArray("names.ini", $names)
    MsgBox(0, "ya", "müsste gehen!")
    Exit
    EndSwitch
    WEnd

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


    brauchen tuhe ich das ganze als erweiterung für das script von trallala: Sophos-Download (Progressbar)

    ich möchte gerne das array in diesem script austauschen, so dass man über mein gui, neue downloads hinzufügen kann die von dem script geladen werden sollen... also das dieses script quasi die *.ini dateien liest und diese dann der reihe nach durchgeht


    Ich hoffe ihr könnt mir helfen

    Mit freundlichen Grüssen,

    Alexander Scherer</GUIConstants.au3></File.au3></Array.au3>

  • wow danke, das hilft mir schon sehr weiter, aber hat vllt jemand auch ne einfache möglichkeit, vllt die 3 sachen zusammenzufassen? also "bezeichung(name)" + "url" + "dateiname"

    oder irgendwie das dateiname wegzulassen oda so? natürlich müsste es auch wie oben angegeben mit dem downloader zusammen passen.?!


    PS: BugFix danke für den supa tipp :)

  • Warum so umständlich ...

    [autoit]

    IniReadSection

    [/autoit]

    gibt dir doch ein 2D-Array zurück !?

    [autoit]

    IniReadSectionNames

    [/autoit]

    gibt dir ein 1D-Array mit allen Sektionsnamen.

    Erstelle dir ein 2D-Array für den Inhalt deiner Inputfelder und gut is' ... ;)
    Oder habe ich da etwas falsch verstanden ?

    [autoit]

    Dim $arData[1][2]
    $arData[0][0] = GuiCtrlRead($url)
    $arData[0][1] = GuiCtrlRead($bezeichnung)
    ;;;
    IniWriteSection($dateiname, $section, $arData)

    [/autoit]

    Gruß
    Greenhorn


  • so leute, ich habs geschafft, werde das script bald auch zum download freigeben, jedoch noch ein letztes problem, und zwar hier:

    Spoiler anzeigen


    For $i = 1 To UBound($quelle) - 1
    $groesse = InetGetSize($quelle[$i][0])
    MsgBox (0,"",$groesse)
    If @error = 1 Then
    _ArrayDelete( $quelle, $quelle[$i][0])
    _ArrayDelete( $quelle, $quelle[$i][1])
    MsgBox ( 0, "Fehler:", $name & " wurde nicht gefunden, wird übersprungen!")
    _ArrayDelete( $name, $name[$i][1])
    EndIf
    Next

    er soll an dieser stelle prüfen, ob die dateien überhaupt noch exestieren, da, wenn diese nicht mehr exestieren das script abbricht, deswegen würde ich nicht exestierende files aus dem array gerne löschen, und bescheit geben.

    jedoch übergeht er diese schleife anscheinend einfach :(

    • Offizieller Beitrag

    Wieder der Hinweis: Bitte in die Hilfe zum Befehl schauen.
    _ArrayDelete() arbeitet NUR mit 1D-Arrays. (OK, steht in der Hilfe nicht explizit. Aber aus Bsp. und Nichterwähnung 2D ableitbar.)
    Verwende die Funktion _Array2DDelete()aus meiner Signatur.

    Edit
    Nochwas:

    [autoit]

    _ArrayDelete( $name, $name[$i][1])

    [/autoit]

    geht so nicht. $name ist ein 1D-Array(oder hast du das geändert?) - also:

    [autoit]

    _ArrayDelete( $name, $name[$i])

    [/autoit]

    Das führt aber zu einem Fehler, weil durch das Löschen das Array kleiner wird und die Indexzuordnung nicht mehr stimmt!
    Empfehlung: NICHT löschen, sondern Null-Strings reinschreiben und beim Abarbeiten die Nullstringinhalte per Abfrage übergehen.

  • So danke erstmal für den Tipp BugFix :)

    habs jetz so gelöst:

    Spoiler anzeigen


    ; Arrays leeren falls datei nicht vorhanden !


    For $i = 1 To UBound($quelle) - 1
    $groesse = InetGetSize($quelle[$i][0])
    If @error = 1 Then
    MsgBox ( 0, "Fehler", "'" & $name[$i][1] & "' wurde nicht gefunden, wird ausgelassen!")
    _Array2DInsert($quelle, $quelle[$i][0], "0")
    _Array2DInsert($quelle, $quelle[$i][1], "0")
    _Array2DInsert($name, $name[$i][1], "0")
    ElseIf $groesse = 0 Then
    MsgBox ( 0, "Fehler", "'" & $name[$i][1] & "' wurde nicht gefunden, wird ausgelassen!")
    _Array2DInsert($quelle, $quelle[$i][0], "0")
    _Array2DInsert($quelle, $quelle[$i][1], "0")
    _Array2DInsert($name, $name[$i][1], "0")
    Else

    EndIf
    Next

    ; ende vom arrays leeren

    For $i = 1 To UBound($quelle) - 1
    If $quelle[$i][0] = "0" Or $name[$i][1] = "0" Then
    $i = $i + 1
    EndIf
    $gesamt += InetGetSize($quelle[$i][0])
    Next

    For $i = 1 To UBound($quelle) - 1
    If $quelle[$i][0] = "0" Or $name[$i][1] = "0" Then
    $i = $i + 1
    EndIf
    $file_size = InetGetSize($quelle[$i][0])
    InetGet($quelle[$i][0], $quelle[$i][1], 1, 1)
    GUICtrlSetData($Group1,"'" & $name[$i][1] & "'")
    $Leer = GUICtrlCreateLabel("",24, 70, 205, 17)
    GUICtrlSetBkColor($Leer, 0x151843)
    While @InetGetActive
    ...
    ...
    ...

    aber es geht immernoch nicht... also er spuckt jetz schon aus das er 2 dateien nicht findet, aber die namen stimmen nicht... heißt quasi,
    er lässt die beiden fehlenden dateien zwar weg, behält aber die normale reihenfolge der namen bei :(

    PS: ja $name ist jetz 2d array... wobei in der zweiten immer der name steht

  • Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    AddDownload()
    DownloadFiles()
    Sleep(4000)

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

    Func AddDownload()

    $hWnd = GUICreate("Download hinzufügen", 553, 124, 205, 192)
    $inpUrl = GUICtrlCreateInput("Url", 64, 8, 425, 21)
    $inpBezeichnung = GUICtrlCreateInput("Bezeichnung", 64, 40, 425, 21)
    $inpZielpfad = GUICtrlCreateInput("Zielpfad", 64, 72, 425, 21)
    $btnSpeichern = GUICtrlCreateButton("Speichern", 200, 96, 145, 25, 0)

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

    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btnSpeichern
    If GUICtrlRead($inpBezeichnung) = '' Or _
    GUICtrlRead($inpBezeichnung) = 'Bezeichnung' Then
    MsgBox(4112, 'Error', 'Bitte geben Sie eine Bezeichnung ein !', 5)
    Else
    SaveArrayData(GUICtrlRead($inpBezeichnung), GUICtrlRead($inpUrl), GUICtrlRead($inpZielpfad)) ; beispiel 2
    EndIf
    EndSwitch
    WEnd

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

    EndFunc

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

    Func DownloadFiles()

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

    $file_size_bytes = 1
    $file_size = 1
    $hWndProgress = GUICreate("", 316, 220, -1, -1,$WS_POPUPWINDOW,$WS_EX_TOOLWINDOW)
    GUISetBkColor(0x151843)
    GUICtrlSetColor(-1, 0xFFFFFF)
    $Group1 = GUICtrlCreateGroup("", 8, 8, 300, 94)
    GUICtrlSetColor($Group1, 0x5B6688)
    $Label11 = GUICtrlCreateLabel("",24,30,170,17)
    GUICtrlSetColor(-1, 0xFEADA2)
    $Label12 = GUICtrlCreateLabel("",24,50,140,17)
    GUICtrlSetColor(-1, 0xC0C0FF)
    $Label13 = GUICtrlCreateLabel("",225,50,70,17, $SS_RIGHT)
    GUICtrlSetColor(-1, 0xFFCB84)
    $Label14 = GUICtrlCreateLabel("",230,70,50,17, $SS_RIGHT)
    GUICtrlSetColor(-1, 0xE0E0C0)
    $Group2 = GUICtrlCreateGroup("'Gesamt'", 8, 110, 300, 94)
    GUICtrlSetColor($Group2, 0x5B6688)
    $Label21 = GUICtrlCreateLabel("",24,132,170,17)
    GUICtrlSetColor(-1, 0xFEADA2)
    $Label22 = GUICtrlCreateLabel("",24,152,140,17)
    GUICtrlSetColor(-1, 0xC0C0FF)
    $Label23 = GUICtrlCreateLabel("",225,152,70,17, $SS_RIGHT)
    GUICtrlSetColor(-1, 0xFFCB84)
    $Label24 = GUICtrlCreateLabel("",230,172,50,17, $SS_RIGHT)
    GUICtrlSetColor(-1, 0xE0E0C0)
    GUISetState(@SW_SHOW)
    Global $startDownloadTime = TimerInit()
    $iSizeAll = 0
    $total = 0
    $arIniNames = IniReadSectionNames(@ScriptDir & '\data.ini') ; enthält alle Sektionsnamen.
    For $i = 1 To $arIniNames[0]
    $iSizeAll += InetGetSize(IniRead(@ScriptDir & '\data.ini', $arIniNames[$i], 'Url', ''))
    Next
    For $i = 1 To $arIniNames[0]
    $arIniSection = IniReadSection(@ScriptDir & '\data.ini', $arIniNames[$i])
    $file_size = InetGetSize($arIniSection[1][1])
    InetGet($arIniSection[1][1], $arIniSection[2][1] & '\' & $arIniSection[3][1], 1, 1)
    GUICtrlSetData($Group1,$arIniNames[$i])
    $Leer = GUICtrlCreateLabel("",24, 70, 205, 17)
    GUICtrlSetBkColor($Leer, 0x151843)
    While @InetGetActive
    Sleep(50)
    $iniDown = @InetGetBytesRead
    $xx101 = Round((($iniDown/$file_size)*100) , 2)
    $xx102 = 24 + $xx101*2
    $xx103 = 1 + Floor($xx101)
    $Progress1 = GUICtrlCreateLabel("",$xx102, 70, 1, 17)
    $Farbe1 = Int(256 - ($xx103 / 128)*255) *65536 + Int((512 * $xx103 / 256)* 255) + Int(($xx103 / 100 * 255) - 512)
    GUICtrlSetBkColor($Progress1,$Farbe1)
    $Left = (($file_Size - @InetGetBytesRead) / $iniDown) * TimerDiff($startDownloadTime)
    $msg_load1 = StringFormat("%03.4f", $iniDown/1048576) & " MB / " & StringFormat("%3.4f", $file_Size/1048576) & " MB"
    $msg_zeit1 = _FormatTime($Left)
    $msg_speed = StringFormat("%3.2f",$iniDown/TimerDiff($startDownloadTime)) & " KB/s"
    GUICtrlSetData($Label11,$msg_load1)
    GUICtrlSetData($Label12,$msg_zeit1)
    GUICtrlSetData($Label13,$msg_speed)
    GUICtrlSetData($Label14,StringFormat("%3.2f",$xx101) & " %")
    $xx201 = Round(((($iniDown+$total)/$iSizeAll)*100) , 2)
    $xx202 = 24 + $xx201*2
    $xx203 = 1 + Floor($xx201)
    $Progress2 = GUICtrlCreateLabel("",$xx202, 172, 1, 17)
    If $xx201 <60 Then
    $Farbe2= Int(256 - (5.12 * $xx203 * 2 / 512) * 2.55) *65536 + Int((512 * $xx203 * 2 / 256)* 255) + Int(($xx203 * 2 / 100 * 255) - 512)
    Elseif $xx201 >60 Then
    $Farbe2= Int(256 - (($xx203 - 60) / 128) * 255) *65536 - int(256 * ($xx203 - 60) * 256) + Int((($xx203 - 60) / 100 * 255)) - 5052 - Int(($xx203/ 100 * $xx203-30)*2)
    EndIf
    GUICtrlSetBkColor($Progress2, $Farbe2)
    $msg_load2 = StringFormat("%03.4f", ($iniDown+$total)/1048576) & " MB / " & StringFormat("%3.4f", $iSizeAll/1048576) & " MB"
    $msg_zeit2 = _FormatTime(TimerDiff($startDownloadTime))
    GUICtrlSetData($Label21,$msg_load2)
    GUICtrlSetData($Label22,$msg_zeit2)
    GUICtrlSetData($Label24,StringFormat("%3.2f",$xx201) & " %")
    WEnd
    $total = $iniDown
    Next

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

    EndFunc

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

    Func _FormatTime($_time)

    $_hours = Floor($_time / 1000 / 3600)
    If $_hours < 10 Then $_hours = "0" & $_hours
    $_min = Int($_time / 1000 / 60)
    If $_min < 10 Then $_min = "0" & $_min
    $_sec = Int($_time / 1000)
    If $_sec < 10 Then $_sec = "0" & $_sec
    $_millisec = Round(Mod($_time, 100), 0)
    If $_millisec < 10 Then $_millisec = "0" & $_millisec
    Return $_hours & ":" & $_min & ":" & $_sec & "," & $_millisec

    EndFunc

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

    Func SaveArrayData($name, $url, $path = @ScriptDir)

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

    If $url = '' Then Return SetError(1, 0, 0)
    $arUrl = StringSplit($path, '/')
    Dim $arData[4][2] ; Array deklarieren.
    $arData[0][0] = 2 ; Anzahl Elemente erste Dimension.
    $arData[0][1] = 2 ; Anzahl Elemente zweite Dimension.
    $arData[1][0] = @TAB & 'Url' ; Key 1
    $arData[1][1] = $url ; Value 1
    $arData[2][0] = @TAB & 'Folder' ; Key 2
    $arData[2][1] = $path ; Value 2
    $arData[3][0] = @TAB & 'File' ; Key 3
    $arData[4][1] = $arUrl[$arUrl[0]] ; Value 3

    IniWriteSection(@ScriptDir & '\data.ini', $name, $arData, 1)

    EndFunc

    [/autoit]


    data.ini

    Spoiler anzeigen
    Code
    [Sophos Antivirus Free]
    	Url=http://www.sophos.com/tools/sav32sfx.exe
    	Folder=J:\Downloads
    	File=sav32sfx.exe
    [Bitdefender Antivirus Free v10]
    	Url=http://download.bitdefender.com/windows/free/winfree/en/bitdefender_free_v10.exe
    	Folder=J:\Downloads
    	File=bitdefender_free_v10.exe