Warum werden Dateien nicht kopiert? Hilfe

  • 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.
    #include "_GetIntersection.au3"
    #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]

    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][/autoit] [autoit]

    ;-----------------------

    [/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()

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

    $Option_Entscheidung = MsgBox(52, "Achtung!!!","Möchten Sie die Daten im Quellordner" &@CRLF & "nach dem Kopiervorgang 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

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

    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")
    Return
    Else
    _ArrayDisplay($aFileList_Quell, "Quelle")
    EndIf

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

    $aFileList_Ziel = _FileListToArray($OpenZiel)

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

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

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

    ; Unterschiede zwischen $aFileList_Quell und $aFileList_Ziel ermitteln und auflisten
    $ret = _GetIntersection ($aFileList_Quell, $aFileList_Ziel,0, ' ')
    $diff1 = ''
    $diff2 = ''
    If Not @error Then
    For $i = 0 To UBound($ret) -1
    If $ret[$i][1] <> '' Then $diff1 &= $ret[$i][1] & ' ; '
    If $ret[$i][2] <> '' Then $diff2 &= $ret[$i][2] & ' ; '
    Next
    EndIf

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

    If $diff1 <> $diff2 Then
    $aUnterschied_Quell = StringSplit ($diff1,";")
    ;_ArrayDisplay ($aUnterschied_Quell,"$aUnterschied_Quell")
    For $h = 1 To $aUnterschied_Quell[1]
    FileCopy($OpenQuell & "\" & $aUnterschied_Quell[$h],$OpenZiel,9)
    If @error = 1 Then
    MsgBox (0,"","Fehler")
    EndIf
    Next
    EndIf
    ;MsgBox(0, '', 'Unterschiede 1: ' & $diff1 & @LF & 'Unterschiede 2: ' & $diff2)

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

    EndFunc

    [/autoit]

    Sorry wegen meinem Programmierstil. Bin halt noch ein Newbie. :rolleyes:

  • Morgen, habe dein Script mal ein Bisschen aufgeräumt .. kann aber leider nicht testen ob es geht weil mir ein Include Fehlt '_getinteractions' solltest du Hilfe bei Scripten brauchen in der du nicht nur Standart Includes verwendest bitte immer die nötigen Files mit an den Thread anheften.. anderenfalls können wir dir schlecht helfen :P

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    ; By Hexpirator
    ; Das Script soll Dateien aus dem Quellordner mit denen aus dem Zielordner
    ; vergleichen und neu hinzugefügten Dateien in den Zielordner kopieren.
    ;#include "_GetIntersection.au3"

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

    Global $OpenQuell = 0
    Global $OpenZiel = 0

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

    #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][/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][/autoit] [autoit]

    ;-----------------------

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

    Func _Open_Quell()
    $OpenQuell = FileSelectFolder("Quellordner wählen", "Arbeitsplatz",'',@UserProfileDir)
    EndFunc
    ;-----------------------

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

    Func _Open_Ziel()
    $OpenZiel = FileSelectFolder("Zielordner wählen", "Arbeitsplatz",'',@UserProfileDir)
    EndFunc
    ;-----------------------

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

    Func _Radiodelete()
    $Option_Entscheidung = MsgBox(52, "Achtung!!!","Möchten Sie die Daten im Quellordner" &@CRLF & "nach dem Kopiervorgang 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()
    If $OpenQuell = 0 Then _Open_Quell()
    If $OpenZiel = 0 Then _Open_Ziel()

    $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")
    Return
    Else
    _ArrayDisplay($aFileList_Quell, "Quelle")
    EndIf

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

    $aFileList_Ziel = _FileListToArray($OpenZiel)

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

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

    #cs
    ; Unterschiede zwischen $aFileList_Quell und $aFileList_Ziel ermitteln und auflisten
    $ret = _GetIntersection ($aFileList_Quell, $aFileList_Ziel,0, ' ')
    $diff1 = ''
    $diff2 = ''
    If Not @error Then
    For $i = 0 To UBound($ret) -1
    If $ret[$i][1] <> '' Then $diff1 &= $ret[$i][1] & ' ; '
    If $ret[$i][2] <> '' Then $diff2 &= $ret[$i][2] & ' ; '
    Next
    EndIf

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

    If $diff1 <> $diff2 Then
    $aUnterschied_Quell = StringSplit ($diff1,";")
    ;_ArrayDisplay ($aUnterschied_Quell,"$aUnterschied_Quell")
    For $h = 1 To $aUnterschied_Quell[1]
    FileCopy($OpenQuell & "\" & $aUnterschied_Quell[$h],$OpenZiel,9)
    If @error = 1 Then
    MsgBox (0,"","Fehler")
    EndIf
    Next
    EndIf
    ;MsgBox(0, '', 'Unterschiede 1: ' & $diff1 & @LF & 'Unterschiede 2: ' & $diff2)
    #ce

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

    EndFunc

    [/autoit]


    Gruß

  • So hab jetzt in Thread 1 die fehlende Datei angehängt.

    Das funktioniert soweit alles, nur der FileCopy-Befehl will irgendwie nicht. :(

    Ich weiß aber nicht was ich da falsch mache. Gruß.

  • Spoiler anzeigen
    [autoit]


    FileCopy($OpenQuell & "/" & $aUnterschied_Quell[$h],$OpenZiel,9)

    [/autoit]

    Der Slash war '\' richtig ist aber '/' :)

    Gruß Marvin

  • Bist du dir da wirklich sicher oder vermutest du das nur.

    In den Beispielen hier im Forum wird immer "\" Backslash geschrieben und in der Hilfe auch. ?(
    Hast du es denn mit "/" getestet?

    Ich wäre echt dankbar, wenn sich jemand mein Script mal anschauen würde.

    Gruß

  • So läufts

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <_GetIntersection.au3>
    ; By Hexpirator
    ; Das Script soll Dateien aus dem Quellordner mit denen aus dem Zielordner
    ; vergleichen und neu hinzugefügten Dateien in den Zielordner kopieren.
    ;#include "_GetIntersection.au3"

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

    Global $OpenQuell = 0
    Global $OpenZiel = 0

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

    #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][/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][/autoit] [autoit]

    ;-----------------------

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

    Func _Open_Quell()
    $OpenQuell = FileSelectFolder("Quellordner wählen", "Arbeitsplatz",'',@UserProfileDir)
    EndFunc
    ;-----------------------

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

    Func _Open_Ziel()
    $OpenZiel = FileSelectFolder("Zielordner wählen", "Arbeitsplatz",'',@UserProfileDir)
    EndFunc
    ;-----------------------

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

    Func _Radiodelete()
    $Option_Entscheidung = MsgBox(52, "Achtung!!!","Möchten Sie die Daten im Quellordner" &@CRLF & "nach dem Kopiervorgang 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()
    If $OpenQuell = 0 Then _Open_Quell()
    If $OpenZiel = 0 Then _Open_Ziel()

    [/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")
    Return
    Else
    _ArrayDisplay($aFileList_Quell, "Quelle")
    EndIf

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

    $aFileList_Ziel = _FileListToArray($OpenZiel)

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

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

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

    ; Unterschiede zwischen $aFileList_Quell und $aFileList_Ziel ermitteln und auflisten
    $ret = _GetIntersection ($aFileList_Quell, $aFileList_Ziel,0, ' ')
    $diff1 = ''
    $diff2 = ''
    If Not @error Then
    For $i = 0 To UBound($ret) -1
    If $ret[$i][1] <> '' Then $diff1 &= $ret[$i][1] & ' ; '
    If $ret[$i][2] <> '' Then $diff2 &= $ret[$i][2] & ' ; '
    Next
    EndIf

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

    If $diff1 <> $diff2 Then
    $aUnterschied_Quell = StringSplit ($diff1,";",2)
    _ArrayDisplay($aUnterschied_Quell)
    ;_ArrayDisplay ($aUnterschied_Quell,"$aUnterschied_Quell")
    For $h = 1 To UBound($aFileList_Quell)-1
    FileCopy($OpenQuell & "\" & $aUnterschied_Quell[$h],$OpenZiel)
    If @error = 1 Then
    MsgBox (0,"","Fehler")
    EndIf
    Next
    EndIf
    ;MsgBox(0, '', 'Unterschiede 1: ' & $diff1 & @LF & 'Unterschiede 2: ' & $diff2)

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

    EndFunc

    [/autoit]
  • Hallo Protex
    so läuft es zwar, aber es kopiert mir einfach die gesamten Dateien aus dem Quellverzeichnis in das Zielverzeichnis.
    Oder verstehe ich da etwas falsch?
    Ich wollte aber dass es mir nur die Differenz zwichen den beiden Verzeichnissen kopiert.

    Mag sein ,dass ich es falsch interprätiere.

    Gruß, Hexpirator

  • soweit ich dein mitgeliefertes Script verstehe müsste in dieser $aunterschied_quelle nur die Dateien stehen die im anderen Verzeichniss nicht sind somit kopiert er auch nur die die dort nicht sind.. andernfalls musst du es halt noch anpassen sollte aber kein Problem sein

    Gruß Marvin

  • Hallo Marvin.

    Soweit ich dein geändertes Script verstehe, wird in diesem Teil

    [autoit]

    For $h = 1 To UBound($aFileList_Quell)-1
    FileCopy($OpenQuell & "\" & $aUnterschied_Quell[$h],$OpenZiel)

    [/autoit]

    die For-Schleife sooft durchlaufen wie es Dateien im Quellverzeichnis gibt.
    Das heißt, wenn in $aFileList_Quell 100000 Dateien sind, wird die Schleife dementsprechend 100000 mal durchlaufen.
    die Differenz zwischen Ziel und Quellverzeichnis wird aber meist kleiner sein.

    müsste in der For-Schleife nicht $aUnterschied_Quell genommen werden? Oder verstehe ich das falsch?

    Gruß

  • Dann verstehe ich aber nicht, wor der Unterschied zu meinem Script sein soll, bis auf den Flag, den ich gesetzt habe.

    [autoit]

    $aUnterschied_Quell[1]

    [/autoit]


    die 1 musste ich nehmen, weil im [0] die Anzahl, der Segmente steht und in [1] die tatsächlichen Unterschiede zwischen Quell und Zielordner.

  • Der Fehler saß im letzten Teil, habs ausgebessert mit hoffentlich genug Kommentaren ;)

    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.
    #include "_GetIntersection.au3"
    #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]

    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][/autoit] [autoit]

    ;-----------------------

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

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

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

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

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

    Func _Radiodelete()

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

    $Option_Entscheidung = MsgBox(52, "Achtung!!!", "Möchten Sie die Daten im Quellordner" & @CRLF & "nach dem Kopiervorgang 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

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

    EndFunc ;==>_Radiodelete
    ;-----------------------

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

    Func _Los()
    $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")
    Return
    Else
    _ArrayDisplay($aFileList_Quell, "Quelle")
    EndIf

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

    $aFileList_Ziel = _FileListToArray($OpenZiel)

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

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

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

    ; Unterschiede zwischen $aFileList_Quell und $aFileList_Ziel ermitteln und auflisten
    $ret = _GetIntersection($aFileList_Quell, $aFileList_Ziel, 0, ' ')
    $diff1 = ''
    $diff2 = ''
    If Not @error Then
    For $i = 0 To UBound($ret) - 1
    If $ret[$i][1] <> '' Then $diff1 &= $ret[$i][1] & ' ; '
    If $ret[$i][2] <> '' Then $diff2 &= $ret[$i][2] & ' ; '
    Next
    EndIf

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

    If $diff1 <> $diff2 Then ; Diff1 sah bei mir so aus : $diff1 = 2 ; 2.TXT ;
    $aUnterschied_Quell = StringSplit($diff1, ";") ; hier trennst du nach ";", dabei kommt folgendes raus
    ; $aUnterschied_Quell[0] = '3'
    ; $aUnterschied_Quell[1] = '2 '
    ; $aUnterschied_Quell[2] = ' 2.TXT'
    ; $aUnterschied_Quell[3] = ' '
    ; es sind überall noch Leerzeichen vorhanden
    ; also nehmen wir die noch raus
    For $h = 1 To Number(StringstripWS($aUnterschied_Quell[1], 8)) ; entfernt alle Leerzeichen, es wird eine Zahl erwartet, die kann keine Leerzeichen haben
    FileCopy($OpenQuell & "\" & StringstripWS($aUnterschied_Quell[$h], 3), $OpenZiel & "\" & StringstripWS($aUnterschied_Quell[$h], 3), 9) ; entfernt führende und nachfolgende Leerzeichen und gibt auch den neuen Dateinamen an
    If @error = 1 Then
    MsgBox(0, "", "Fehler")
    EndIf
    Next
    EndIf
    ;MsgBox(0, '', 'Unterschiede 1: ' & $diff1 & @LF & 'Unterschiede 2: ' & $diff2)

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

    EndFunc ;==>_Los

    [/autoit]
  • Hallo TheLuBu.

    Die Kommentare sind goldwert. Ich habe die Leerzeichen einfach nicht gesehen. Sind ja auch so schwer zu sehen. ;) :D
    Dank dir bin ich schon ein gutes Stück weiter gekommen. Jetzt werden wenigstens schon mal Dateien kopiert.
    Das Problem ist, dass die Verzeichnisse vernachlässigt werden.

  • such mal nach Dateiliste rekursiv von Bugfix, der hat das schon geschrieben, damit werden alle Dateien auch in Unterordnern aufgelistet.

  • Danke für den Tip.

    Ich bekomme einen Fehler, wenn kein Unterschied in dem Ordner ist.
    Das steht dann in der Konsole

    FileCopy($OpenQuell & "\" & StringstripWS($aUnterschied_Quell[$h], 3), $OpenZiel & "\" & StringstripWS($aUnterschied_Quell[$h], 3), 9)
    FileCopy($OpenQuell & "\" & StringstripWS(^ ERROR