Im Array Einträge suchen, die vom anderen Array stammen und bei Misserfolg Datei kopieren.

  • Hi Leute.

    Folgendes Problem.
    Ich habe 2 mal FileListToArray. das eine vom Quellordner, das andere vom Ziel...
    Nu möchte ich die beiden Arrays miteinander vergleichen und wenn ein Eintrag im Ziel-Array nicht vorhanden ist, die entsprechende Datei dann kopieren.
    Was mir noch Kopfzerbrechen beritet ist, dass ich auch Ordner habe, die auch Unterordner enthalten könnten.
    Mir will einfach nicht in die Birne, wie ich die beiden Programmschnipsel realisieren soll. ?(

    Hat da jemand von euch vielleicht mal eine Idee?

    Hier ist mein bisheriger Code. Ich weiß das Gui könnte man schöner und funktionaler gestalten, aber das ist mein erstes. Kann nur besser werden.

    Spoiler anzeigen
    [autoit]

    ; By Hexpirator

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

    ; Das Script soll Dateien aus dem Quellordner mit denen aus dem Zielordner
    ; vergleichen und neu hinzugefügten Dateien in den Zielordner kopieren.

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

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

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

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Dateiarchivierer", 402, 293, 261, 151)
    $Datei = GUICtrlCreateMenu("&Datei")
    $Quelle = GUICtrlCreateMenuItem("Quellordner auswählen... (Q)", $Datei)
    $Ziel = GUICtrlCreateMenuItem("Zielordner auswählen... (Z)", $Datei)
    $Beenden = GUICtrlCreateMenuItem("Programm Beenden... (Strg+X)", $Datei)
    $Group1 = GUICtrlCreateGroup("Option wählen:", 8, 104, 377, 81)
    $Radio_loeschen = GUICtrlCreateRadio("Daten im Quellordner löschen !!!", 24, 152, 177, 17)
    $Radio_behalten = GUICtrlCreateRadio("Daten im Quellordner beibehalten", 24, 128, 185, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Modus wählen:", 8, 8, 377, 81)
    $Radio_einmalig = GUICtrlCreateRadio("Daten einmalig abgleichen ?", 24, 32, 161, 17)
    $Radio_automat = GUICtrlCreateRadio("Daten automatisch nach vorgegebener Zeit angleichen", 24, 56, 297, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Los = GUICtrlCreateButton("Los", 8, 224, 83, 33, $WS_GROUP)
    $Label1 = GUICtrlCreateLabel("By Hexpirator", 104, 240, 75, 17)
    GUISetState(@SW_SHOW)
    Dim $Form1_1_AccelTable[1][2] = [["^!p", $Ziel]]
    GUISetAccelerators($Form1_1_AccelTable)
    #EndRegion ### END Koda GUI section ###

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

    ; Variablen Deklaration
    Global $OpenQuell = 0
    Global $OpenZiel = 0
    ;----------------------

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    ;-----------------------
    Case $GUI_EVENT_CLOSE, $Beenden
    Exit
    ;-----------------------
    Case $Quelle
    _Open_Quell()
    ;-----------------------
    Case $Ziel
    _Open_Ziel()
    ;-----------------------
    Case $Radio_loeschen
    _Radiodelete()
    ;-----------------------
    Case $Los
    _Los()
    ;-----------------------
    EndSwitch
    WEnd

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

    Func _Open_Quell()
    $OpenQuell = FileSelectFolder("Quellordner wählen", "Arbeitsplatz")
    EndFunc

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

    Func _Open_Ziel()
    $OpenZiel = FileSelectFolder("Zielordner wählen", "Arbeitsplatz")
    EndFunc

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

    Func _Radiodelete()
    $Option_Entscheidung = MsgBox(52, "Achtung!!!","Möchten Sie die Daten im" &@CRLF & "Quellordner wirklich löchen?")
    ;MsgBox(0,"lesen",$Option_Entscheidung) ;beim JA-drücken -> 6 beim NEIN -> 7
    If $Option_Entscheidung = 7 Then
    GUICtrlSetState($Radio_loeschen, $GUI_UNCHECKED)
    GUICtrlSetState($Radio_behalten, $GUI_CHECKED)
    EndIf
    EndFunc

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

    Func _Los()

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

    $Radio_einmalig_Status = GUICtrlRead ($Radio_einmalig)
    $Radio_automat_Status = GUICtrlRead ($Radio_automat)
    If $Radio_einmalig_Status = $Radio_automat_Status Then
    MsgBox (48, "Modus","Bitte Modus wählen.")
    Return
    EndIf

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

    $Radio_behalten_Status = GUICtrlRead ($Radio_behalten)
    $Radio_loeschen_Status = GUICtrlRead ($Radio_loeschen)
    If $Radio_behalten_Status = $Radio_loeschen_Status Then
    MsgBox (48, "Option","Bitte Option wählen.")
    Return
    EndIf

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

    $aFileList_Quell = _FileListToArray($OpenQuell)

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

    If @error = 1 Then
    MsgBox(64,"Info","Bitte wählen Sie den Quellordner")
    Else
    _ArrayDisplay($aFileList_Quell, "Quelle")
    EndIf
    ;Return
    $aFileList_Ziel = _FileListToArray($OpenZiel)

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

    If @error = 1 Then
    MsgBox(64,"Info","Bitte wählen Sie den Zielordner")
    Else
    _ArrayDisplay($aFileList_Ziel, "Ziel")
    EndIf

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

    For $i = 1 to UBound($aFileList_Quell) -1
    ;
    ; Hier soll das rein was mir einfach nicht in die Birne will.
    ;

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

    ;$iIndex = _ArraySearch($aFileList_Ziel[$i],$aFileList_Quell[$i])
    MsgBox(0, "Countup", $iIndex)
    Next
    MsgBox(0,"", "Start!")

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

    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von hexpirator (24. November 2011 um 23:11)

  • Sorry, aber es mag an meinem Unvermögen liegen, was Arrays anbelangt.

    Könntest du mir vielleicht einen konkreteren Tipp geben?

    Ich habe schon viele deiner Beiträge gelesen und weiß, dass du ein echter Array- Profi bist.

    Gruß.

    • Offizieller Beitrag

    Sag mal, hast du Angst davor, die Funktion aufzurufen? :whistling:
    Probier doch einfach aus und schau, was du als Ergebnis bekommst.
    Bsp.
    - dein Array1 (Quellordner) enthält: [datei1,datei2,datei3,datei4,datei5,datei6,datei7]
    - dein Array2 (Zielordner) enthält: [datei1,datei2,datei3,datei4]

    Somit erwartest du als Ergebnis: "datei5,datei6,datei7" ==> Elemente, die NUR in Menge 1 vorkommen.

    Ruf die Funktion auf:

    [autoit]

    $ErgebnisArray = _GetIntersection($Array1, $Array2)

    [/autoit]


    Was sagt dir die Funktionsbeschreibung?


    Also ist das, was du suchst, im Ergebnissarry in der Spalte Nummer 2 (Index 1) zu finden.

    [ Ich frage mich ernsthaft, wozu ich meine Funktionen so präzise kommentiere. Wenn es keiner liest, kann ich mir den Aufwand auch sparen. ;( ]

  • Sorry. Ich habe deine Udf gestern schon in mein Script implementiert und es liefert mir genau das richtige was ich gesucht habe.
    Vielleicht hab ich da oben zu schnell geantwortet. Tschuldigung. :S
    Saubere Arbeit.

    danke nochmal.