Arrays vergleichen

  • Hallo erstmal :D , ich bin noch nicht lange in der Autoit Szene und hab mal mich mal an ein etwas "größeres" getraut. Jedoch, ist es auch mit einigen Problemen verbunden.

    Was das Programm beherschen sollte:
    Zuerst macht man einen Scan von einem Ordner, zb einem Spiel ohne Patch, einem Programm ohne Lizenz oder auch einem Ordner den man überwachen möchte...
    Danach macht man einen zweiten Scan. Dieser Scan soll bewirken, dass man die Veränderung auslesen kann und (aus)nutzen kann.

    Die Probleme:
    Das Programm erkennt manchmal die Veränderungen nicht
    Zeile 122 - 132 meiner Meinung nach :S

    Eigene Vermutung:
    Ich glaube daran ist die Funktion "_ObjAListSearch" schuld, denn sie behält die Arrays und nimmt sie nach einem zweiten anklicken des Buttons "Vergleich" wieder in den Vergleich der Arrays auf, doch ich schaffe es nicht die Arrays wieder in die Ursprungsform (vor dem 1. Vergleich) zu pressen.

    Zukünfige Entwicklung:

    Bald (hoffe ich) soll das Programm in der Lage sein, die Veränderung auf Bytes genau wahrzunehmen und ein Fenster öffnen, in dem die Veränderungen angezeigt werden (ist schon im code enthalten, aber bisher ungenutzt).

    Code:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include<UDF_ArrayAlternatives.au3>
    #Include <GuiListBox.au3>
    #Include <GuiListView.au3>

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

    Global $Files
    Global $BefList_1 = _ObjAListCreate()
    Global $AftList_1 = _ObjAListCreate()
    Global $BefList_2 = _ObjAListCreate()
    Global $AftList_2 = _ObjAListCreate()

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

    Global $sDiff1 = ''
    #Region ### START Koda GUI section ### Form=
    $Form2 = GUICreate("Form1", 701, 451, 192, 124)
    $Label1 = GUICtrlCreateLabel("Auswertung", 280, 24, 94, 22)
    GUICtrlSetFont(-1, 12, 800, 0, "Myriad Web Pro")
    $ListView3 = GUICtrlCreateListView("", 24, 64, 650, 361, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_READONLY,$WS_VSCROLL))
    _GUICtrlListView_InsertColumn($ListView3, 0, "Gelöscht", 216)
    _GUICtrlListView_InsertColumn($ListView3, 1, "Verändert", 216)
    _GUICtrlListView_InsertColumn($ListView3, 1, "Erstellt", 216)

    GUISetState(@SW_HIDE)
    #EndRegion ### END Koda GUI section ###

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

    #Region ### START Koda GUI section ### Form=c:\users\andy\desktop\koda\forms\form1.kxf
    $Form1 = GUICreate("Vergleich", 800, 550, 192, 124)
    $listview1 = GUICtrlCreateListView ("",20,175,370,300, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_READONLY,$WS_VSCROLL))
    _GUICtrlListView_InsertColumn($ListView1, 0, "Pfad", 260)
    _GUICtrlListView_InsertColumn($ListView1, 1, "Größe in Bytes", 100)
    $Label1 = GUICtrlCreateLabel("Ordner:", 75, 80, 55, 22)
    GUICtrlSetFont(-1, 12, 400, 0, "Myriad Web Pro")
    GUICtrlSetBkColor (-2,$GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetColor (-3,0xFFFF)
    $Input1 = GUICtrlCreateInput(@ProgramFilesDir, 160, 77, 513, 28)
    GUICtrlSetState(-1,$GUI_ACCEPTFILES)
    GUICtrlSetFont(-2, 12, 400, 0, "MS Sans Serif")
    $Button1 = GUICtrlCreateButton("...", 688, 75, 57, 33)
    $Button2 = GUICtrlCreateButton("Before-Scan", 112, 130, 153, 41)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $listview2 = GUICtrlCreateListView ("",400,175,370,300, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_READONLY,$WS_VSCROLL))
    _GUICtrlListView_InsertColumn($ListView2, 0, "Pfad", 260)
    _GUICtrlListView_InsertColumn($ListView2, 1, "Größe in Bytes", 100)

    $Button3 = GUICtrlCreateButton("After-Scan", 514, 130, 153, 41)
    GUICtrlSetFont(-1, 10, 800, 0, "MS Sans Serif")
    $Button4 = GUICtrlCreateButton("Vergleich", 295, 488, 200, 45)
    GUICtrlSetFont(-1, 14, 800, 0, "MS Sans Serif")
    $Button5 = GUICtrlCreateButton("Load Before-Scan", 20, 479, 130, 41)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Button6 = GUICtrlCreateButton("Save Before-Scan", 150, 479, 130, 41)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Button7 = GUICtrlCreateButton("Load After-Scan", 510, 484, 130, 41)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    $Button8 = GUICtrlCreateButton("Save After-Scan", 640, 484, 130, 41)
    GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

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

    Case $Button1
    GUICtrlSetData($Input1, FileSelectFolder("", "", 3))

    Case $Button2
    $Read = _GUICtrlListView_GetItemText($listview1,0)
    If $Read <> "" Then _GUICtrlListView_DeleteAllItems($listview1)
    $Path = GUICtrlRead ($Input1)
    $Files = _GetFileList($Path,'*',0)
    For $i = 1 to Ubound($Files) - 1
    $Size = FileGetSize ($Files[$i])
    GUICtrlCreateListViewItem($Files[$i]&"|"&$Size,$listview1)
    Next

    Case $Button3
    $Read = _GUICtrlListView_GetItemText($listview2,0)
    If $Read <> "" Then _GUICtrlListView_DeleteAllItems($listview2)
    $Path = GUICtrlRead ($Input1)
    $Files = _GetFileList($Path,'*',0)
    For $i = 1 to Ubound($Files) - 1
    $Size = FileGetSize ($Files[$i])
    GUICtrlCreateListViewItem($Files[$i]&"|"&$Size,$listview2)
    Next

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

    Case $Button4 ; Vergleich

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

    Global $a
    Global $b

    $count1 = _GUICtrlListView_GetItemCount ($listview1) ; BEFORE
    For $i = 0 To $count1 -2
    $Read1 = _GUICtrlListView_GetItemText($listview1,$i)
    $Read2 = _GUICtrlListView_GetItemText($listview1,$i,1)
    $a = $Read1&":"&$Read2&"|"&$a
    Next
    $Before = "'"&$a&_GUICtrlListView_GetItemText($listview1,$count1-1)&":"&_GUICtrlListView_GetItemText($listview1,$count1-1,1)&"'"
    MsgBox (0,"test",$before)
    $count2 = _GUICtrlListView_GetItemCount ($listview2) ; AFTER
    For $i = 0 To $count2 -2
    $Read3 = _GUICtrlListView_GetItemText($listview2,$i)
    $Read4 = _GUICtrlListView_GetItemText($listview2,$i,1)
    $b = $Read3&":"&$Read4&"|"&$b
    Next
    $After = "'"&$b&_GUICtrlListView_GetItemText($listview2,$count2-1)&":"&_GUICtrlListView_GetItemText($listview2,$count2-1,1)&"'"
    MsgBox (0,"test",$after)

    _ObjAListAddColl($BefList_1, $Before)
    _ObjAListAddColl($AftList_1, $After)
    _ObjAListAddColl($BefList_2, $Before)
    _ObjAListAddColl($AftList_2, $After)

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

    For $element1 In $BefList_1
    If Not _ObjAListSearch($AftList_1, $element1) Then $sDiff1 = $element1
    Next
    MsgBox(0,"Vergleich von Liste A zu B", $sDiff1)
    $sDiff1 = ""

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

    For $element2 In $AftList_2
    If Not _ObjAListSearch($BefList_2, $element2) Then $sDiff2 = $element2
    Next
    MsgBox(0,"Vergleich von Liste B zu A", $sDiff2)
    $sDiff2 = ""

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

    Case $Button5
    $File = FileOpenDialog("Datei auswählen",@ScriptDir,"Textdatein (*.txt)",1)
    $Read = _GUICtrlListView_GetItemText($listview1,0)
    If $Read <> "" Then _GUICtrlListView_DeleteAllItems($listview1)
    $Split = StringRegExpReplace($File, "^.*\\", "")
    $Open = FileOpen ($Split)
    $count = _FileCountLines ($File)
    For $i = 1 to $count
    $Read = FileReadLine ($Open,$i)
    GUICtrlCreateListViewItem($Read,$listview1)
    Next

    Case $Button6
    $File = FileSaveDialog("Speichern unter",@ScriptDir,"Textdatein (*.txt)")
    $Create = _FileCreate ($File&".txt")
    $hFile = FileOpen($File&".txt",2)
    $count = _GUICtrlListView_GetItemCount ($listview1)

    For $i = 0 To $count
    $ListeAfter = _GUICtrlListView_GetItemTextString($listview1,$i)
    FileWriteLine($hFile,$ListeAfter)
    Next
    FileClose($hFile)

    Case $Button7
    $File = FileOpenDialog("Datei auswählen",@ScriptDir,"Textdatein (*.txt)",1)
    $Read = _GUICtrlListView_GetItemText($listview2,0)
    If $Read <> "" Then _GUICtrlListView_DeleteAllItems($listview2)
    $Split = StringRegExpReplace($File, "^.*\\", "")
    $Open = FileOpen ($Split)
    $count = _FileCountLines ($File)
    For $i = 1 to $count
    $Read = FileReadLine ($Open,$i)
    GUICtrlCreateListViewItem($Read,$listview2)
    Next

    Case $Button8
    $File = FileSaveDialog("Speichern unter",@ScriptDir,"Textdatein (*.txt)")
    $Create = _FileCreate ($File&".txt")
    $hFile = FileOpen($File&".txt",2)
    $count = _GUICtrlListView_GetItemCount ($listview2)

    For $i = 0 To $count
    $ListeAfter = _GUICtrlListView_GetItemTextString($listview2,$i)
    FileWriteLine($hFile,$ListeAfter)
    Next
    FileClose($hFile)

    EndSwitch
    WEnd

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

    Func _GetFileList($T_DIR,$T_MASK,$DIR_ONLY=0)
    Dim $N_DIRNAMES[2000000] ; max number of directories that can be scanned
    Local $N_DIRCOUNT = 0
    Local $N_FILE
    Local $N_SEARCH
    Local $N_TFILE
    Local $N_OFILE
    Local $T_FILENAMES
    Local $T_FILECOUNT
    Local $T_DIRCOUNT = 1
    Local $FILEMASK
    ; check Filemask \ for empty File-Array by GetDirOnly
    If $FILEMASK = "n" Then $FILEMASK = "*.no"
    ; remove the end \ If specified
    If StringRight($T_DIR,1) = "\" Then $T_DIR = StringTrimRight($T_DIR,1)
    $N_DIRNAMES[$T_DIRCOUNT] = $T_DIR
    ; Exit if base dir doesn't exists
    If Not FileExists($T_DIR) Then Return 0
    ; keep on looping until all directories are scanned
    While $T_DIRCOUNT > $N_DIRCOUNT
    $N_DIRCOUNT = $N_DIRCOUNT + 1
    ; find all subdirs in this directory and save them in a array
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\*.*")
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib( $N_TFILE ),"D") > 0 Then
    $T_DIRCOUNT = $T_DIRCOUNT + 1
    $N_DIRNAMES[$T_DIRCOUNT] = $N_TFILE
    EndIf
    Wend
    FileClose($N_SEARCH) ; find all Files that mtach the MASK
    $N_SEARCH = FileFindFirstFile($N_DIRNAMES[$N_DIRCOUNT] & "\" & $T_MASK )
    If $N_SEARCH = -1 Then ContinueLoop
    While 1
    $N_FILE = FileFindNextFile($N_SEARCH)
    If @error Then ExitLoop
    ; skip these references
    If $N_FILE = "." Or $N_FILE = ".." Then ContinueLoop
    $N_TFILE = $N_DIRNAMES[$N_DIRCOUNT] & "\" & $N_FILE
    ; if Directory than add to the list of directories to be processed
    If StringInStr(FileGetAttrib( $N_TFILE ),"D") = 0 Then
    $T_FILENAMES = $T_FILENAMES & $N_TFILE & @CR
    $T_FILECOUNT = $T_FILECOUNT + 1
    ;MsgBox(0,'filecount ' & $T_FILECOUNT ,$N_TFILE)
    EndIf
    Wend
    FileClose($N_SEARCH)
    Wend
    If $DIR_ONLY = 0 Then
    $T_FILENAMES = StringTrimRight($T_FILENAMES,1)
    $N_OFILE = StringSplit($T_FILENAMES,@CR)
    Return( $N_OFILE )
    Else
    ReDim $N_DIRNAMES[$N_DIRCOUNT+1]
    $N_DIRNAMES[0] = $N_DIRCOUNT
    Return $N_DIRNAMES
    EndIf
    EndFunc ;==>_GetFileList

    [/autoit]

    Ps: Man braucht da zu die UDF von Bugfix! (Klick mich )

  • Bei deinem Vergleich hast du vergessen deine Listen zu leeren. Sonst hast du die Suchergebnisse vom letzten mal immer noch drin. Mach jedesmal wenn du in den Vergleich kommst _ObjAListClear() mit all deinen Objekten. Dann sollte es gehen.

    Gruss Shadowigor

  • das geht irgendwie nicht :(
    ich setze in objalistclear ($BefList_1) und die anderen ein, aber es geht nicht!! :(