stringreplace bricht ab und meint es gäbe ein problem mit den array

  • ich habe die ganzen tage etwas zusammengeschustert, das mit hosts dateien nach squid kompatiblen dateien konvertieren soll.
    eigentlich geht es auch, aber $avArray[$i] = StringReplace($avArray[$i], "127.0.0.1 ", "") macht zicken, wenn das array am ende ist.

    es kommt dann:
    $avArray[$i] = StringReplace($avArray[$i], "127.0.0.1 ", "")
    ^ ERROR

    warum?
    und warum wird mir der autoit code der hier im forums editor steht nichzt im post angezeigt?
    ich habe die aktuelle version (hat noch den namen des ursprünglichen projekts) angefügt.

    [autoit]


    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=host2squid.exe
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Add_Constants=n
    #AutoIt3Wrapper_Run_Tidy=y
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Array.au3>
    #include <File.au3>
    #include <String.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <WindowsConstants.au3>
    #include <Misc.au3>

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

    AutoItSetOption("GUIOnEventMode", 1)
    Global $avArray[1]
    ;~ Global $stringleft = ' ##['
    ;~ Global $stringleft2 = '## ['
    ;~ Global $stringright = ']' & @LF
    ;~ $stringclean = 0

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

    #region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("host 2 squid", 464, 152, 192, 114)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
    $Progress1 = GUICtrlCreateProgress(24, 24, 425, 20)
    $Open = GUICtrlCreateButton("Open", 40, 88, 60, 49)
    GUICtrlSetOnEvent($Open, "Open")
    $Download = GUICtrlCreateButton("Download", 100, 88, 60, 49)
    GUICtrlSetOnEvent($Download, "Download")
    $Save = GUICtrlCreateButton("Save", 297, 88, 120, 49)
    GUICtrlSetState($Save, $GUI_DISABLE)
    GUICtrlSetOnEvent($Save, "Save")
    $Label1 = GUICtrlCreateLabel("", 170, 88, 120, 17)
    $Label2 = GUICtrlCreateLabel("", 170, 108, 120, 17)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

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

    While 1
    Sleep(1000) ; Idle around
    WEnd

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

    Func CLOSEClicked()
    Exit
    EndFunc ;==>CLOSEClicked

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

    Func Download()
    Local $hDownload = InetGet("http://www.mvps.org/winhelp2002/hosts.txt", @ScriptDir & "\hosts.txt", 1, 1)
    GUICtrlSetData($Label2, "Die Liste wird geladen")
    Do
    Local $aData = InetGetInfo($hDownload) ; Get all information.
    GUICtrlSetData($Progress1, ($aData[0] / $aData[1]) * 100)
    Until InetGetInfo($hDownload, 2) ; Check if the download is complete.
    Local $aData = InetGetInfo($hDownload) ; Get all information.
    InetClose($hDownload) ; Close the handle to release resources.
    GUICtrlSetData($Label2, "Fertig Heruntergeladen")
    #region --- CodeWizard generated code Start ---
    ;MsgBox features: Title=No, Text=Yes, Buttons=Yes and No, Icon=None
    If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
    $iMsgBoxAnswer = MsgBox(4, "Verarbeiten des Downloads?", "Bytes read: " & $aData[0] & @CRLF & _
    "Size: " & $aData[1] & @CRLF & _
    "Complete?: " & $aData[2] & @CRLF & _
    "Successful?: " & $aData[3] & @CRLF)
    Select
    Case $iMsgBoxAnswer = 6 ;Yes
    Global $file = @ScriptDir & "\hosts.txt"
    Verarbeitung()
    Case $iMsgBoxAnswer = 7 ;No
    EndSelect
    #endregion --- CodeWizard generated code Start ---

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

    EndFunc ;==>Download

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

    Func Open()
    Global $file = FileOpenDialog("", @HomeDrive, "host dateien(*.acl;*.txt)", 1)
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Else
    Verarbeitung()
    EndIf

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

    EndFunc ;==>Open

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

    Func Save()
    $var = FileSaveDialog("", @HomeDrive, "acl datei(*.acl)", 16) & ".acl"
    If @error Then
    MsgBox(4096, "", "Save cancelled.")
    Else
    If FileExists($var) Then
    If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
    $iMsgBoxAnswer = MsgBox(4, "File Exists", "Overwrite?")
    Select
    Case $iMsgBoxAnswer = 6 ;Yes
    _FileCreate($var)
    FileOpen($var, 1)
    $stringtofile = ""
    GUICtrlSetData($Label2, "Die Liste wird gespeichert")
    For $y = 0 To UBound($avArray) - 1
    $stringtofile = $avArray[$y] & @CRLF
    FileWrite($var, $stringtofile)
    Next
    FileClose($var)
    GUICtrlSetData($Label2, "")
    Case $iMsgBoxAnswer = 7 ;No
    MsgBox(4096, "", "Save cancelled.")
    EndSelect
    EndIf
    EndIf
    EndFunc ;==>Save

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

    Func Verarbeitung()
    Global $avArray[1]
    $stringleft = ' ##['
    $stringleft2 = '#['
    $stringleft3 = '# ['
    $stringright = ']' & @LF

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

    GUICtrlSetData($Progress1, 0)
    GUICtrlSetState($Open, $GUI_DISABLE)
    GUICtrlSetState($Download, $GUI_DISABLE)
    _FileReadToArray($file, $avArray)
    $zeilen = UBound($avArray)
    GUICtrlSetData($Label2, "ESC zum abbrechen")
    For $i = 1 To $zeilen - 1
    If _IsPressed("1B") Then ExitLoop
    $avArray[$i] = StringReplace($avArray[$i], "127.0.0.1 ", "")
    If @error Then
    EndIf

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

    GUICtrlSetData($Progress1, ($i / $zeilen) * 100)
    GUICtrlSetData($Label1, $i & " von " & $zeilen)

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

    $stringclean = 0
    $string = _StringBetween($avArray[$i], $stringleft, ""); $stringright)
    If Not @error Then
    $avArray[$i] = StringReplace($avArray[$i], $stringleft & $string[0], "")
    EndIf
    $string2 = _StringBetween($avArray[$i], $stringleft2, ""); $stringright)
    If Not @error Then
    $avArray[$i] = StringReplace($avArray[$i], $stringleft2 & $string2[0], "")
    EndIf
    $string3 = _StringBetween($avArray[$i], $stringleft3, ""); $stringright)
    If Not @error Then
    _ArrayDelete($avArray, $i)
    $i = $i - 1
    EndIf
    Next

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

    ;~ $zeilen = _FileCountLines($file)
    ;~ GUICtrlSetData($Label2, "ESC zum abbrechen")
    ;~ For $i = 1 To $zeilen
    ;~ GUICtrlSetData($Progress1, ($i / $zeilen) * 100)
    ;~ $zeile = FileReadLine($file, $i)
    ;~ $zeile = StringReplace($zeile, "127.0.0.1 ", "")
    ;~ $stringclean = 0
    ;~ $string = _StringBetween($zeile, $stringleft, ""); $stringright)
    ;~ If Not @error Then
    ;~ $stringclean = StringReplace($zeile, $stringleft & $string[0], "")
    ;~ EndIf
    ;~ $string2 = _StringBetween($zeile, $stringleft2, ""); $stringright)
    ;~ If Not @error Then
    ;~ $stringclean = StringReplace($zeile, $stringleft2 & $string2[0], "")
    ;~ EndIf
    ;~ If StringIsAlNum($stringclean) = 0 Then
    ;~ If $stringclean <> "" Then _ArrayAdd($avArray, $stringclean)
    ;~ Else
    ;~ If $zeile <> "" Then _ArrayAdd($avArray, $zeile)
    ;~ EndIf
    ;~ GUICtrlSetData($Label1, $i & " von " & $zeilen)
    ;~ If _IsPressed("1B") Then ExitLoop
    ;~ Next
    ;~ GUICtrlSetData($Label2, "Die Liste wird bereinigt...")
    ;~ _ArrayUnique($avArray)
    MsgBox(0, "", "27 zeilen löschen")
    For $i = 1 To 27
    _ArrayDelete($avArray, 0)
    Next
    ;~ GUICtrlSetData($Label2, "")
    _ArrayDisplay($avArray)
    ;~ FileClose($file)
    ;~ GUICtrlSetState($Open, $GUI_ENABLE)
    ;~ GUICtrlSetState($Download, $GUI_ENABLE)
    ;~ GUICtrlSetState($Save, $GUI_ENABLE)
    EndFunc ;==>Verarbeitung

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Na die Meldung wird doch sicherlich ausführlicher sein als nur "^Error".
    Ich vermute mal darüber steht noch:

    Code
    Array variable has incorrect number of subscripts or subscript dimension range exceeded.

    Falls ja: dann willst du ein Element des Arrays ansprechen welches gar nicht existiert.
    Denk daran: Array-Indizes sind in AutoIt 0-basiert. Das erste Element ist als $Array[0] - demzufolge findet man das letzte bei...?

  • D:\Temp\Kopie von on event test FileReadLine.au3 (129) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    das problem dabei ist nur das genau die codezeile ja super funktioniert hat, bevor ich optimierungen vorgenommen habe.
    da fand das script ja auch kein problem damit.
    jetzt habe ich die zeile direkt an den anfang der for schleife gestellt und nichts geht mehr. vorher stand die ziemlich weit am ende.

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

  • sorry, aber du hilfst mir gerade gar nicht, weil ich nicht weiss auf was du hinaus willst.
    hast du dir den code denn schon angesehen?
    das array ist mit einer position generiert und die for schleife fängt mit 1 an. also muss avarray[$i] avarray[1] sein.

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

  • Ich bin eher für Hilfe zur Selbsthilfe statt direkter Vorgaben.
    Daher:
    Füge doch einfach mal direkt vor die betreffende Zeile folgendes ein - vielleicht kommst du dann eher auf den Grund:

    [autoit]

    ConsoleWrite("$i:" & $i & @TAB & "Ubound($avArray):" & Ubound($avArray) & @CRLF)

    [/autoit]
  • so weit war ich auch schon und das gesamte script läuft super, bis zu dem punkt wo die letzte zeile des arrays dran ist.
    dann kommt das anfangs beschriebene.
    das ist es ja was mich stutzig macht.

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

  • Das Problem ist hier nicht der Startindex, bzw die Arraygröße, das ist anfangs korrekt soweit ich das sehe, denn hier kommt das Array von _filereadtoarray und ist 1-based. Die Variable $zeilen entspricht ubound(), hier wird korrekterweise noch 1 subtrahiert im Schleifenkopf, also auch richtig. Das Problem liegt hier aber darin, dass innerhalb der Schleife Elemente des Arrays gelöscht werden. Konkret sieht die Schleife verkürzt so aus:

    [autoit]


    _FileReadToArray($file, $avArray)
    $zeilen = UBound($avArray)
    For $i = 1 To $zeilen - 1
    $avArray[$i] = StringReplace($avArray[$i], "127.0.0.1 ", "")
    ;....
    $string3 = _StringBetween($avArray[$i], $stringleft3, ""); $stringright)
    If Not @error Then
    _ArrayDelete($avArray, $i)
    $i = $i - 1
    EndIf
    Next

    [/autoit]

    Zahlenbeispiel:
    Dein Array enthält anfangs 10 Einträge, also 9 Textzeilen (ubound-1).
    Die Schleife beginnt bei i=1, also die erste der 9 Zeilen.
    Nun gehen wir davon aus, dass dieser Index gelöscht wird, weil die letzte if Bedingung erfüllt ist.
    i wird demzufolge um 1 reduziert, also auf 0 gesetzt.
    Die Schleife startet den nächsten Durchgang, dabei wird i wieder auf 1 gesetzt. Dein Problem ab hier.... das Array ist nun um eine Zeile kleiner (9-1, also 8 Textzeilen), aber deine Variable $zeilen ist immernoch 10-1, sprich 9 Textzeilen.
    Spätestens dann, wenn die Schleife an einem nicht mehr existierendem Index des Arrays ankommt stürzt dein Script ab.
    Du müsstest also auch die Variable für die Abbruchbedingung um 1 reduzieren, wenn du während der Schleife das Array verkleinerst. Alternativ solltest du vielleicht gleich ubound im Schleifenkopf verwenden, da dann die Arraygröße dynamisch ermittelt werden dürfte.

  • so weit war ich auch schon


    Du hast also schon die beschriebene Zeile eingefügt und bist nicht stutzig geworden dass $i und Ubound($...) den selben Wert erreichen?
    Dir ist klar das der maximale Index eines Arrays Ubound($...) - 1 ist?


    Tipp: Wenn man ein Array durchgeht und dabei Elemente löschen will sollte man es eher von hinten nach vorne durchgehen.


  • das wars. :)

    habe nun zeilen mit reduzieren lassen (zeile 23) und eine abbruchkontition bei $i = $zeilen hinzugefügt (zeile 2).

    ist das so richtig, oder gibt es da elegantere lösungen?

    [autoit]

    For $i = 1 To $zeilen - 1
    If $i = $zeilen Then ExitLoop
    If _IsPressed("1B") Then ExitLoop
    ConsoleWrite("$i:" & $i & @TAB & "Ubound($avArray):" & UBound($avArray) & @CRLF)
    $avArray[$i] = StringReplace($avArray[$i], "127.0.0.1 ", "")

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

    GUICtrlSetData($Progress1, ($i / $zeilen) * 100)
    GUICtrlSetData($Label1, $i & " von " & $zeilen)

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

    $stringclean = 0
    $string = _StringBetween($avArray[$i], $stringleft, ""); $stringright)
    If Not @error Then
    $avArray[$i] = StringReplace($avArray[$i], $stringleft & $string[0], "")
    EndIf
    $string2 = _StringBetween($avArray[$i], $stringleft2, ""); $stringright)
    If Not @error Then
    $avArray[$i] = StringReplace($avArray[$i], $stringleft2 & $string2[0], "")
    EndIf
    $string3 = _StringBetween($avArray[$i], $stringleft3, ""); $stringright)
    If Not @error Then
    _ArrayDelete($avArray, $i)
    $i = $i - 1
    $zeilen = $zeilen - 1
    EndIf

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

    Next

    [/autoit]



    Du hast also schon die beschriebene Zeile eingefügt und bist nicht stutzig geworden dass $i und Ubound($...) den selben Wert erreichen?
    Dir ist klar das der maximale Index eines Arrays Ubound($...) - 1 ist?

    da das auf der arbeit recht lange dauert (sehr langsamer rechner) habe ich immer die gelegenheit genutzt um was anderes zu erledigen. das der eine wert rauf und der andere runter, ist mir nicht in den sinn gekommen. :(


    Tipp: Wenn man ein Array durchgeht und dabei Elemente löschen will sollte man es eher von hinten nach vorne durchgehen.


    von hinten nach vorne hatte ich zu anfang mal, aber das dauert ewig. wenn man die werte abcheckt und einfach nicht mit ins array nimmt ist das schneller als wenn man nochmals das array durchgeht.

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    Einmal editiert, zuletzt von Maximus1 (22. Mai 2013 um 15:28)

  • ist das so richtig, oder gibt es da elegantere lösungen?


    So:

    [autoit]

    For $i = UBound($avArray) - 1 To 1 Step -1
    If _IsPressed("1B") Then ExitLoop

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

    GUICtrlSetData($Progress1, (($zeilen - $i) / $zeilen) * 100)
    GUICtrlSetData($Label1, $i & " von " & $zeilen)

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

    $avArray[$i] = StringRegExpReplace($avArray[$i], "(#{1,2}\[.*|127.0.0.1\s+)", "")
    If StringInStr($avArray[$i], "# [", 1) Then _ArrayDelete($avArray, $i)
    Next

    [/autoit]

    4 Mal editiert, zuletzt von AspirinJunkie (22. Mai 2013 um 15:38)

  • ne das passt gar nicht.
    127.0.0.1 wird gar nicht gelöscht.

    ok das passt, aber mir jetzt aufgefallen das nun über 1500 einträge flöten gehen. das können nicht alles reine comment zeilen sein.

    If StringInStr($avArray[$i], "# [", 2) Then _ArrayDelete($avArray, $i)
    muss ich mir mal ansehen, da die zu rigoros vorgeht.

    auf jeden fall ist das ja mal richtig fix. :)

    ich danke euch und versuche mal den rest in der art zuende zu bringen.

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    Einmal editiert, zuletzt von Maximus1 (22. Mai 2013 um 15:47)

  • "(#{1,2}\[.*|127.0.0.1\s\s)"

    ...verstehe ich nicht.
    127.0.0.1 ist klar, aber was zum beispiel bedeutet das alles bis hin zu 127.0.0.1?
    \s ist theroretisch auch klar, aber \s+ oder \s\s ?

    wo kann mal etwas ausführlicher was über StringRegExpReplace lesen ?
    ich verstehe das nicht.

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

  • Vielleicht in der dt. Hilfe...? :huh:

    Einfach drauf klicken:

    [autoit]

    StringRegExp

    [/autoit]

    Aber so ganz kurz:
    {1,2} --> Das Zeichen soll 1 oder 2 mal vorkommen
    \s\s --> Zwei Spaces, äquivalent zu \s{2}
    \s+ --> 1 oder mehrere Spaces
    \[ --> Escapen von "[", da dieses sonst als Gruppenanfang gezählt würde
    .* --> Ein beliebiges Zeichen (!\n\r) welches 0 bis mehrfach vorkommen kann
    | --> logisches ODER
    lg

  • ja die hilfe ist mir oft auch eine hilfe, aber manches ist mir dann doch zu kryptisch erklärt und ich weiss nach dem lesen nicht was man mir da erklären wollte.
    daher ja auch die frage ob es das auch in ausführlicher gibt.

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

  • Nur durch die AutoIt-Hilfe wird man reguläre Ausdrücke nicht verstehen.
    Prinzipiell sind reguläre Ausdrücke auch nichts AutoIt-spezifisches sondern sind in so gut wie jeder Programmiersprache vorhanden.
    Kurz gesagt sind sie eine mächtige Methode zur Prüfung, Filterung und Veränderung von Strings.
    Es gibt zig Tutorials dazu - eines speziell für AutoIt wäre z.B. >>Dieses<<.

    Wenn man das dann mal drauf hat (dauert bisschen aber lohnt sich) kann man dein Programm auch noch weiter optimieren.
    Besonders fix und schlank wird es dann z.B. dadurch das man die Datei nicht zeilenweise in einem Array bearbeitet sondern gleich direkt alle nötigen Informationen direkt per regulärem Ausdruck rausfiltert.
    Habe mir daher mal erlaubt dein Skript etwas umzubauen als Beispiel:

    Vorschlag für Skriptumbau
    [autoit]

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Outfile=host2squid.exe
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Add_Constants=n
    #AutoIt3Wrapper_Run_Tidy=y
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

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

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

    AutoItSetOption("GUIOnEventMode", 1)

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

    Global Const $s_HOSTURL = "http://www.mvps.org/winhelp2002/hosts.txt"
    Global Const $s_FILESTANDARDPATH = @ScriptDir & "\hosts.txt"

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

    Global $a_URLs

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

    #region GUI
    GUICreate("host 2 squid", 464, 152, 192, 114)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

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

    Global $Progress1 = GUICtrlCreateProgress(24, 24, 425, 20)
    Global $Open = GUICtrlCreateButton("Open", 40, 88, 60, 49)
    GUICtrlSetOnEvent($Open, "Open")

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

    GUICtrlCreateButton("Download", 100, 88, 60, 49)
    GUICtrlSetOnEvent(-1, "Download")

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

    Global $ctrl_Save = GUICtrlCreateButton("Save", 297, 88, 120, 49)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetOnEvent(-1, "Save")

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

    Global $Label1 = GUICtrlCreateLabel("", 170, 88, 120, 17)
    Global $Label2 = GUICtrlCreateLabel("", 170, 108, 120, 17)

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

    GUISetState(@SW_SHOW)
    #endregion GUI

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

    While 1
    Sleep(1000)
    WEnd

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

    Func Download()
    Local $iMsgBoxAnswer, $aData
    Local $hDownload = InetGet($s_HOSTURL, $s_FILESTANDARDPATH, 1, 1)

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

    GUICtrlSetData($Label2, "Die Liste wird geladen")
    Do
    Local $aData = InetGetInfo($hDownload) ; Get all information.
    GUICtrlSetData($Progress1, ($aData[0] / $aData[1]) * 100)
    Until InetGetInfo($hDownload, 2) ; Check if the download is complete.

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

    $aData = InetGetInfo($hDownload) ; Get all information.
    InetClose($hDownload) ; Close the handle to release resources.
    GUICtrlSetData($Label2, "Fertig Heruntergeladen")

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

    If MsgBox(4, "Verarbeiten des Downloads?", "Bytes read: " & $aData[0] & @CRLF & _
    "Size: " & $aData[1] & @CRLF & _
    "Complete?: " & $aData[2] & @CRLF & _
    "Successful?: " & $aData[3] & @CRLF) = 6 Then Verarbeitung($s_FILESTANDARDPATH)
    EndFunc ;==>Download

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

    Func Open()
    Local $file = FileOpenDialog("", @HomeDrive, "host dateien(*.acl;*.txt)", 1)
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Else
    Verarbeitung($file)
    EndIf
    EndFunc ;==>Open

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

    Func Save()
    Local $s_SaveFilePath = FileSaveDialog("", @HomeDrive, "acl datei(*.acl)", 16) & ".acl"
    If @error Then
    MsgBox(4096, "", "Save cancelled.")
    Return False
    EndIf

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

    If FileExists($s_SaveFilePath) Then
    If MsgBox(4, "File Exists", "Overwrite?") = 7 Then Return MsgBox(4096, "", "Save cancelled.")
    EndIf

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

    _FileWriteFromArray($s_SaveFilePath, $a_URLs)
    If @error Then MsgBox(48, "Fehler", "Fehler beim Schreiben der Datei" & @CRLF & @CRLF & "@error:" & @TAB & @error)

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

    GUICtrlSetData($Label2, "")
    EndFunc ;==>Save

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

    Func Verarbeitung($s_FilePath)
    Local $s_File = FileRead($s_FilePath)
    $s_File = StringTrimLeft($s_File, StringInStr($s_File, @CRLF, 1, 29) + 1) ; Header entfernen (die ersten 29 Zeilen)

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

    $a_URLs = StringRegExp($s_File, "(?m)^127.0.0.1\s+([^\s#]+)", 3) ; die URLS per regulärem Ausdruck herausfiltern (Ergebnis ist ein Array)
    If @error Or UBound($a_URLs) = 0 Then
    MsgBox(48, "Fehler", "Keine gültigen URLS in der Host-Datei gefunden!")
    Return SetError(1, @error, False)
    EndIf

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

    _ArrayDisplay($a_URLs)
    GUICtrlSetState($ctrl_Save, $GUI_ENABLE)
    EndFunc ;==>Verarbeitung

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

    Func CLOSEClicked()
    FileDelete($s_FILESTANDARDPATH)
    Exit
    EndFunc ;==>CLOSEClicked

    [/autoit]

    Einmal editiert, zuletzt von AspirinJunkie (23. Mai 2013 um 08:52)