MultiFileMove

  • Hallo,

    ich möchte ein MutliFileMove Funktion erstellen die die Aufgabe hat: die TXT Datein von Quelle(Dirstart) zu Ziel(DirZiel) verschoben werden und mit entsprechende profil gespeichert wird.
    ich kann meine Quelle, Ziel und Profil entweder manuell eingeben oder mit der Funktion AddRandomFiles automatisch in einem Listview GUI einlesen. sieht das ganze so aus : (Bild 1)

  • Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <Array.au3>
    #include <ListViewConstants.au3>
    #include <Guilistview.au3>
    #include <ButtonConstants.au3>
    #include <WindowsConstants.au3>
    #include <Date.au3>
    #include <File.au3>

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

    Global $sHeader = "QUELLE|ZIEL|PROFIL"
    Global $iEdit = -1
    Global $sDBFile = @DesktopDir & "\datenbank.txt"
    Local $MoveFile = "F:\PoolData\#Move"

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

    #Region Hauptfenster
    Global $MainGui = GUICreate("Listview-Datenbank", 1200, 1000) ; Hauptfenster erstellen
    GUISetBkColor(0x00E0F1FF)
    Global $MainGUI_ListView = GUICtrlCreateListView($sHeader, 10, 0, 1180, 900, $LVS_SHOWSELALWAYS) ; Listview erstellen

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

    Global $MainGui_Handle = GUICtrlGetHandle($MainGUI_ListView) ; das Handle vom Listview wird für die UDF-Listview-Funktionen benötigt
    _GUICtrlListView_SetColumn($MainGui_Handle, 0, "QUELLE", 430, 0)
    _GUICtrlListView_SetColumn($MainGui_Handle, 1, "ZIEL", 450, 0)
    _GUICtrlListView_SetColumn($MainGui_Handle, 2, "PROFIL", 300, 0)

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

    Global $MainGui_Button_New = GUICtrlCreateButton("Neuer Eintrag", 70, 930, 80, 50, $BS_DEFPUSHBUTTON) ; Dieser Button ist der Default-Push-Button (wenn der User [Enter] drückt)
    Global $Maingui_Button_Edit = GUICtrlCreateButton("Markierten Eintrag bearbeiten", 200, 930, 110, 50, $BS_MULTILINE) ; $BS_Multiline für mehrzeiligen Button
    Global $MainGui_Button_inputFile = GUICtrlCreateButton("InputFile", 360, 930, 70, 50)
    Global $MainGui_Button_MoveFiles = GUICtrlCreateButton("Move File(s)",480,930,70,50)
    Global $MainGui_Button_Save = GUICtrlCreateButton("Speichern", 600, 930, 70, 50)
    Global $MainGui_Button_Del = GUICtrlCreateButton("Markierte Einträge löschen", 720, 930, 90, 50, $BS_MULTILINE)
    Global $MainGui_Button_DelAll = GUICtrlCreateButton("Alle Einträge löschen", 870, 930, 90, 50, $BS_MULTILINE)

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

    Global $MainGui_CM = GUICtrlCreateContextMenu($MainGUI_ListView) ; ein Kontextmenü für das Listview erstellen
    Global $MainGui_CMNew = GUICtrlCreateMenuItem("Neuer Eintrag", $MainGui_CM) ; der 1. Kontextmenüeintrag
    Global $MainGui_CMEdit = GUICtrlCreateMenuItem("Eintrag bearbeiten", $MainGui_CM) ; der 2. Kontextmenüeintrag
    Global $MainGui_CMDel = GUICtrlCreateMenuItem("Markierte Einträge löschen", $MainGui_CM) ; der 3. Kontextmenüeintrag
    #EndRegion Hauptfenster

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

    #Region Fenster für neuen Eintrag
    Global $SubGui_NewLine = GUICreate("Neuer Eintrag", 632, 140, -1, -1, $WS_SYSMENU) ; das Fenster "Neuer Eintrag" erstellen
    Global $NewLine_Header = StringSplit($sHeader, '||') ; Überschriften-Array
    Global $Input_NewLine[$NewLine_Header[0]] ; Array für die Input-IDs
    For $i = 1 To $NewLine_Header[0]
    GUICtrlCreateLabel($NewLine_Header[$i], 1 + ($i-1) * 225, 15, 110, 20) ; Überschriften-Label erstellen
    $Input_NewLine[$i-1] = GUICtrlCreateInput("", 2 + ($i-1) * 200, 30, 220, 20, Default, $WS_EX_STATICEDGE) ; Eingabefelder erstellen
    Next
    Global $Button_Create = GUICtrlCreateButton("Eintrag speichern", 154, 65, 120, 25, $BS_DEFPUSHBUTTON) ; Button zum speichern
    Global $Button_CLose = GUICtrlCreateButton("schließen", 354, 65, 120, 25)
    #EndRegion Fenster für neuen Eintrag

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

    _GUICtrlListView_RegisterSortCallBack($MainGui_Handle)
    GUISetState(@SW_SHOW, $MainGui)

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

    While 1
    $nMsg = GUIGetMsg(1)
    Switch $nMsg[0]
    Case $MainGUI_ListView ; User hat auf eine Spaltenüberschrift geklickt
    _GUICtrlListView_SortItems($MainGui_Handle, GUICtrlGetState($MainGUI_ListView))
    Case $MainGui_Button_New, $MainGui_CMNew ; User hat auf "Neuer Eintrag" geklickt
    WinSetTitle($SubGui_NewLine, "", "Neuer Eintrag")
    GUISetState(@SW_SHOW, $SubGui_NewLine) ; das Fenster "Neuer Eintrag" anzeigen
    GUISetState(@SW_DISABLE, $MainGui) ; das Hauptfenster deaktivieren
    Case $Button_Create ; User hat auf "Eintrag speichern" im Fenster "Neuer Eintrag" geklickt
    NewItem()
    Case $Maingui_Button_Edit, $MainGui_CMEdit ; User hat auf "Eintrag bearbeiten" geklickt
    WinSetTitle($MainGui_CMNew, "", "Eintrag bearbeiten")
    GUISetState(@SW_SHOW, $SubGui_NewLine)
    GUISetState(@SW_DISABLE, $MainGui)
    Edit()
    Case $MainGui_Button_inputFile ; User hat auf "InputFile" geklickt
    AddRandomFiles ()
    Case $MainGui_Button_MoveFiles ; User hat auf "MoveFile" geklickt
    ;MultiFileMove()
    Case $MainGui_Button_Save ; User hat auf "speichern" geklickt
    Save()
    Case $MainGui_Button_Del, $MainGui_CMDel ; User hat auf "Markierte Einträge löschen" geklickt
    If MsgBox(256 + 32 + 4, "Einträge löschen", "Wollen sie die markierten Einträge wirklich löschen?") = 6 Then _GUICtrlListView_DeleteItemsSelected($MainGui_Handle)
    Case $MainGui_Button_DelAll ; User hat auf "Alle Einträge löschen" geklickt
    If MsgBox(256 + 32 + 4, "Einträge löschen", "Wollen sie wirklich alle Einträge löschen?") = 6 Then _GUICtrlListView_DeleteAllItems($MainGui_Handle)
    Case $Button_CLose ; User hat auf "schließen" im Fenster "Neuer Eintrag" geklickt
    GUISetState(@SW_HIDE, $SubGui_NewLine)
    GUISetState(@SW_ENABLE, $MainGui)
    WinActivate($MainGui)
    Case $GUI_EVENT_CLOSE ; User hat auf das Schließen-Symbol geklickt (bzw. die ESC-Taste gedrückt)
    Switch $nMsg[1] ; erweiterte Abfrage für welches Fenster
    Case $MainGui ; User will das Hauptfenster schließen
    If MsgBox(32 + 4, "Beenden", "Wollen sie das Programm wirklich beenden?") = 6 Then End() ; wenn ja, dann End-Funktion aufrufen
    Case $SubGui_NewLine ; User will das "Neuer Eintrag"-Fenster schließen
    $iEdit = -1
    For $i = 0 To UBound($Input_NewLine) - 1
    GUICtrlSetData($Input_NewLine[$i], "") ; Alle Eingabefelder leeren
    Next
    GUISetState(@SW_HIDE, $SubGui_NewLine) ; "Neuer Eintrag"-Fenster verstecken
    GUISetState(@SW_ENABLE, $MainGui) ; Hauptfenster wieder aktivieren
    WinActivate($MainGui) ; und in den Vordergrund holen
    EndSwitch
    EndSwitch
    WEnd

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

    Func NewItem() ; Funktion zum auslesen der Eingabefelder (Neuer Eintrag bzw. Eintrag bearbeiten)
    Local $sItem = ""
    For $i = 0 To UBound($Input_NewLine) - 1 ; Schleife, um alle Eingabefelder durchzugehen
    If $iEdit > -1 Then ; wenn $iEdit > -1 (Eintrag bearbeiten), dann...
    _GUICtrlListView_SetItemText($MainGui_Handle, $iEdit, GUICtrlRead($Input_NewLine[$i]), $i) ; den Eintrag aus dem Eingabefeld ins Listview schreiben
    Else ; sonst $iEdit = -1 (neuer Eintrag)
    $sItem &= GUICtrlRead($Input_NewLine[$i]) & "|" ; den Eintrag aus dem Eingabefeld erstmal in einer Variablen ($sItem) speichern
    GUICtrlSetData($Input_NewLine[$i], "") ; das entsprechende Eingabefeld leeren
    EndIf
    Next
    If $iEdit > -1 Then ; wenn $iEdit > -1 (Eintrag bearbeiten), dann...
    $iEdit = -1
    GUISetState(@SW_HIDE, $SubGui_NewLine) ; "Neuer Eintrag"-Fenster verstecken
    GUISetState(@SW_ENABLE, $MainGui) ; Hauptfenster wieder aktivieren
    Sleep(3000)
    WinActivate($MainGui) ; und in den Vordergrund holen
    Else ; sonst $iEdit = -1 (neuer Eintrag)
    GUICtrlSetState($NewLine_Header[0], $GUI_FOCUS) ; den Focus wieder auf das erste Eingabefeld setzen, für weitere Eingaben
    GUICtrlCreateListViewItem(StringTrimRight($sItem, 1), $MainGui_ListView) ; mit den Werten aus $sItem einen neuen Listview-Eintrag hinzufügen
    EndIf
    EndFunc ;==>NewItem

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

    Func Edit() ; Funktion zum bearbeiten eines Listview-Eintrags im "Eintrag bearbeiten"-Fenster
    $iEdit = _GUICtrlListView_GetSelectionMark($MainGui_Handle) ; auslesen, welcher Listview-Eintrag markiert (bei mehreren, den obersten) ist
    If $iEdit > -1 Then
    Local $aItem = _GUICtrlListView_GetItemTextArray($MainGui_Handle, $iEdit) ; die Einträge aus dem Listview in ein Array holen
    For $i = 1 To $aItem[0]
    GUICtrlSetData($Input_NewLine[$i - 1], $aItem[$i]) ; und in die entsprechenden Eingabefelder schreiben
    Next
    EndIf
    EndFunc ;==>Edit

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

    Func AddRandomFiles()

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

    Global $TempArray[1]
    Local $aList = _FileListToArray($MoveFile, '*', 1), $aSplit
    If Not IsArray($aList) Then Return SetError(1, 0, '')
    Local $iRan
    For $i = 0 To 30
    $iRan = Random(1, $aList[0], 1)
    _ArraySearch($TempArray, $aList[$iRan]); Suchen ob Eintrag schon existiert
    If @error Then; Eintrag existiert nicht
    $sText = StringStripWS(FileRead($MoveFile & "\" & $aList[$iRan]),2)
    $aSplit = StringSplit($sText,";")
    GUICtrlCreateListViewItem($aSplit[1] & '|' & $aSplit[2]& '|' & $aSplit[3], $MainGUI_ListView)
    _ArrayAdd($TempArray, $aList[$iRan]); Datei in Liste einfügen
    EndIf
    Next
    Return
    EndFunc ;==> AddRandomFiles

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

    Func Save() ; Datenbank-Datei speichern
    Local $sItem
    Local $iCount = _GUICtrlListView_GetItemCount($MainGui_Handle) - 1
    Local $NeuFile = FileOpen($sDBFile, 2)
    If $NeuFile <> -1 Then
    For $i = 0 To $iCount
    $sItem = _GUICtrlListView_GetItemTextString($MainGui_Handle, $i)
    FileWriteLine($NeuFile, $sItem)
    Next
    FileClose($NeuFile)
    EndIf
    EndFunc ;==>Save

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

    Func End()
    ; Save()
    _GUICtrlListView_UnRegisterSortCallBack($MainGui_Handle)
    Exit ; Programm beenden
    EndFunc

    [/autoit]
  • mein Problem liegt da drin, ich habe die Funktion erstellt sieht so aus

    Spoiler anzeigen
    [autoit]

    Func MultiFileMove()
    $DirStart = $aSplit[1]
    $DirZiel = $aSplit[2]
    Local $search, $file, $iSize, $aSplit, $aFiles[1]
    $search = FileFindFirstFile($DirStart& $file)
    If ($search == -1) Then _ ; Keine Dateien gefunden.
    Return $aFiles
    While (TRUE)
    $file = FileFindNextFile($search)
    If (@error) Then _ ; Keine weiteren Dateien gefunden.
    ExitLoop
    If (StringInStr(FileGetAttrib($DirStart & $file), 'D')) Then
    ; Die gefundene Datei ist ein Ordner, also weitersuchen ...
    $aFiles = MultiFileMove ()
    If ($aFiles[0]) Then
    If (not FileExists ($DirZiel & $file)) Then
    DirCreate ($DirZiel & $file)
    If (DirCopy ($DirStart & $file, $DirZiel & $file, 1)) Then _
    DirMove ($DirStart& $file, $DirZiel, 1)
    ConsoleWrite('Ordner wurde Erstellt !! ' & @CRLF)
    Else
    $bSuccess = TRUE
    For $i = 1 To $aFiles[0]
    If (FileCopy ($aFiles[$i], $DirZiel& $file, 9)) Then
    FileDelete ($aFiles[$i])
    Else
    $bSuccess = FALSE
    EndIf
    FileMove ($aFiles[$i], $DirZiel , 9)
    ConsoleWrite('Datei wurde Verschoben !! ' & @CRLF)
    Next
    EndIf
    ReDim $aFiles[1]
    $aFiles[0] = 0
    EndIf
    EndIf
    WEnd
    FileClose($search)
    Return $aFiles
    EndFunc ;===> MultiFileMove

    [/autoit]

    es zeigt mir 2 Fehlermeldung : $aSplit[1] und $aSplit[2] nicht deklariert obwohl die in anderer Funktion schon deklariert sind

  • es zeigt mir 2 Fehlermeldung : $aSplit[1] und $aSplit[2] nicht deklariert obwohl die in anderer Funktion schon deklariert sind


    Und wo soll das deklariert sein? Ich sehe in deinem Script nur hier eine Deklaration der Variable:

    [autoit]


    Func AddRandomFiles()

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

    Global $TempArray[1]
    Local $aList = _FileListToArray($MoveFile, '*', 1), $aSplit

    [/autoit]


    Und diese ist lokal deklariert, also ausserhalb der Funktion garnicht bekannt. Davon ab wirst du so oder so Probleme bekommen wenn du das so machen willst, denn Quell und Zielpfad können doch für jeden Eintrag in deinem Listview unterschiedlich sein. Wenn ich das recht verstanden habe soll die Funktion doch alle Ordner/Dateien im Listview abarbeiten, daher wirst du Ziel und Quellpfade für jeden Eintrag neu ermitteln müssen. Da bietet sich dann eine große Schleife in deiner Funktion an, in der $aSplit jeweils neu ermittelt wird und danach dann der Kopiervorgang für den jeweiligen LW Eintrag abläuft. Nach Abarbeitung der Schleife sind alle LW Einträge erledigt und die Funktion kann verlassen werden.


    EDIT:

    [autoit]


    If (DirCopy ($DirStart & $file, $DirZiel & $file, 1)) Then _
    DirMove ($DirStart& $file, $DirZiel, 1)
    ConsoleWrite('Ordner wurde Erstellt !! ' & @CRLF)
    Else

    [/autoit]

    Das dürfte btw ein Syntax Fehler sein. Nach "Then" darf nur dann code in der selben Zeile folgen, wenn dieser einzeilig ist, d.h. der Unterstrich muss weg, solange du die consolewritefunktion noch aufrufst. Der Unterstrich macht eh keinen Sinn, der ist dazu gedacht lange Zeilen übersichtlicher anzuzeigen, "Then" erlaubt dir aber ohnehin eine neue Zeile zu beginnen, bzw erfordert es sogar wenn mehr als ein einzeiliger Code folgt.

    2 Mal editiert, zuletzt von misterspeed (21. August 2012 um 10:34)