[UPDATED] Copy Manager - Import/Export nun möglich

  • Hallo Leute ;)

    Habe mir ein Programm geschrieben, welches den Kopiervorgang erleichtert (vor allem wenn man mit mehreren und größeren Paketen kopiert).
    Dieser Manager erlaubt es euch eine Liste zu erstellen. Diese Liste wird vom Programm abgearbeitet und eins nach dem anderen kopiert.

    Sicher ist er noch nicht ganz ausgereift, aber grob funktioniert er schonmal.

    Allgemein höre ich sehr gerne eure Meinungen dazu und noch lieber Verbesserungsvorschläge und Hilfen (Vor allem bei der verbesserten Dateiauswahl)!!

    AutoIT v3 Skript:
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListBox.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #Include <GuiListView.au3>

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

    Global $Title = "Copy Manager"
    Dim $LVItem[1000]

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate($Title, 636, 613, 442, 65)
    $Group1 = GUICtrlCreateGroup("Auswahl:", 8, 8, 617, 161)
    $Label1 = GUICtrlCreateLabel("Zu kopierende Dateien/Ordner wählen:", 24, 32, 190, 17)
    $Input1 = GUICtrlCreateInput("", 24, 56, 193, 21)
    $Button1 = GUICtrlCreateButton("Durchsuchen", 224, 56, 84, 22, $BS_FLAT)
    $Label2 = GUICtrlCreateLabel("Zielverzeichnis wählen:", 328, 32, 114, 17)
    $Input2 = GUICtrlCreateInput("", 328, 56, 193, 21)
    $Button2 = GUICtrlCreateButton("Durchsuchen", 528, 56, 84, 22, $BS_FLAT)
    $Checkbox1 = GUICtrlCreateCheckbox("Dateien/Ordner nach Kopiervorgang löschen (Verschieben)", 32, 96, 249, 17)
    $Checkbox2 = GUICtrlCreateCheckbox("Nach Kopiervorgang herunterfahren", 32, 112, 209, 25)
    $Button3 = GUICtrlCreateButton("Hinzufügen", 408, 128, 100, 30, $BS_FLAT)
    $Button4 = GUICtrlCreateButton("Starten", 512, 128, 100, 30, $BS_FLAT)
    $Label4 = GUICtrlCreateLabel("", 32, 144, 137, 17)
    $Button7 = GUICtrlCreateButton("Liste laden...", 288, 88, 100, 22, $BS_FLAT)
    $Label5 = GUICtrlCreateLabel("Format: *.txt ->", 400, 88, 72, 17)
    $Label6 = GUICtrlCreateLabel("Quellpfad|Zielpfad", 472, 88, 89, 17)
    $Label7 = GUICtrlCreateLabel("Quellpfad|Zielpfad", 472, 112, 89, 17)
    $Button8 = GUICtrlCreateButton("Liste speichern...", 288, 112, 100, 22, $BS_FLAT)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $ListView1 = GUICtrlCreateListView("", 8, 176, 617, 401)
    _GUICtrlListView_AddColumn($ListView1, "Nr.", 35)
    _GUICtrlListView_AddColumn($ListView1, "Quellordner", 200)
    _GUICtrlListView_AddColumn($ListView1, "Zielordner", 200)
    _GUICtrlListView_AddColumn($ListView1, "Status", 200)
    $Button5 = GUICtrlCreateButton("Auswahl aus Liste entfernen", 16, 584, 156, 22, $BS_FLAT)
    $Button6 = GUICtrlCreateButton("Beenden", 184, 584, 100, 22, $BS_FLAT)
    $Label3 = GUICtrlCreateLabel("(Beendet das Programm, alle Änderungen gehen verloren!!!)", 288, 584, 286, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

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

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

    Case $Button1
    $SourcePath = FileSelectFolder("Ordner auswählen", "", 1, "", $Form1)
    if @error = 1 Then
    MsgBox(48, "Fehler", "Sie haben keine Dateien ausgewählt")
    EndIf
    GUICtrlSetData($Input1, $SourcePath)

    Case $Button2
    $TargetPath = FileSelectFolder ( "Zielverzeichnis auswählen:", "", 1, "", $Form1)
    if @error = 1 Then
    MsgBox(48, "Fehler", "Sie haben keine Dateien ausgewählt")
    EndIf
    GUICtrlSetData($Input2, $TargetPath)

    Case $Button3
    _AddToList()

    Case $Button4
    if FileExists(GUICtrlRead($Input1)) and FileExists(GUICtrlRead($Input1)) then
    _AddToList()
    endif
    _CopySelected()

    Case $Button5
    $ItemSelected = _GUICtrlListView_GetSelectionMark($ListView1)
    _GUICtrlListView_DeleteItemsSelected($ListView1)
    _ArrayDelete($LVItem, $ItemSelected)
    _RefreshNR()
    ReDim $LVItem[1000]

    Case $Button6
    Exit

    Case $Button7
    _LoadList()

    Case $Button8
    _SaveList()
    EndSwitch
    WEnd

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

    func _AddToList()
    $Source = GUICtrlRead($Input1)
    $Target = GUICtrlRead($Input2)
    If FileExists($Source) = 0 then
    MsgBox(48, "Fehler", $Source&" ist kein gültiger Dateipfad")
    Return
    EndIf
    if FileExists($Target) = 0 then
    MsgBox(48, "Fehler", $Target&" ist kein gültiger Dateipfad")
    Return
    endif
    GUICtrlSetData($Input1, "")
    GUICtrlSetData($Input2, "")
    $ItemCount = _GUICtrlListView_GetItemCount($ListView1)
    $LVItem[$ItemCount] = GUICtrlCreateListViewItem($ItemCount + 1&"|"&$Source&"|"&$Target&"|Warte", $ListView1)
    endfunc

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

    func _CopySelected()
    For $i = 0 to _GUICtrlListView_GetItemCount($ListView1) - 1
    $ItemContent = _GUICtrlListView_GetItemTextArray($ListView1, $i)
    $copySource = $ItemContent[2]
    $copyTarget = $ItemContent[3]
    GUICtrlSetData($LVItem[$i], "|||Kopiere")
    $identify = FileGetAttrib($copySource)
    If StringInStr($identify, "D") = 0 then
    if ControlCommand($Title, "", $Checkbox1, "IsChecked", "") = 1 Then
    FileMove($copySource, $copyTarget)
    else
    FileCopy($copySource, $copyTarget)
    endif
    else
    Runwait(@ComSpec & " /c " & "xcopy " & '"' & $copySource & '"' & ' "' & $copyTarget & '"' & " /E /C", @SystemDir, @SW_HIDE) ;DirCopy funzt nicht :/
    if ControlCommand($Title, "", $Checkbox1, "IsChecked", "") = 1 Then
    DirRemove($copySource, 1) ;DirMove funzt auch nich 8| :/
    endif
    EndIf
    if FileExists($copyTarget) = 0 Then
    GUICtrlSetData($LVItem[$i], "|||Fehler")
    MsgBox(48, "Fehler", $copySource&" konnte nicht kopiert werden", 10)
    else
    GUICtrlSetData($LVItem[$i], "|||Abgeschlossen")
    endif
    Next
    if ControlCommand($Title, "", $Checkbox2, "IsChecked", "") = 1 Then
    Shutdown(1)
    EndIf
    MsgBox(0, "Fertig", "Kopiervorgang abgeschlossen!")
    Return
    endfunc

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

    func _RefreshNR()
    $Icount = _GUICtrlListView_GetItemCount($ListView1)
    For $i = 0 to $Icount - 1
    $aIcount = _GUICtrlListView_GetItemTextArray($ListView1, $i)
    GUICtrlSetData($LVItem[$i], $i + 1&"|"&$aIcount[2]&"|"&$aIcount[3]&"|Warte")
    Next
    endfunc

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

    func _LoadList()
    $ListPath = FileOpenDialog ( "Bitte wählen sie die TXT-Datei mit der Liste aus:", @DesktopDir, "Textdateien (*.txt)" , 1, "", $Form1)
    $ListCount = _FileCountLines($ListPath)
    if @error = 1 Then
    MsgBox(48, "Fehler", $ListPath&" konnte nicht geöffnet werden!")
    Return
    EndIf
    $ListFile = FileOpen($ListPath)
    if $ListFile = -1 Then
    MsgBox(48, "Fehler", $ListPath&" konnte nicht geöffnet werden!")
    Return
    endif
    For $i = 1 to $ListCount
    $ListLine = FileReadLine($ListFile, $i)
    $Paths = StringSplit($ListLine, "|")
    if @error = 1 Then
    MsgBox(48, "Fehler", $ListPath&' ist falsch formatiert! Bitte trennen sie die Pfade mit "|" [ALTGR + <] und beginnen sie jeden Kopierauftrag in einer neuen Zeile!')
    Return
    EndIf
    $ItemCount = _GUICtrlListView_GetItemCount($ListView1)
    $LVItem[$ItemCount] = GUICtrlCreateListViewItem($ItemCount + 1&"|"&$Paths[1]&"|"&$Paths[2]&"|Warte", $ListView1)
    Next
    FileClose($ListFile)
    endfunc

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

    func _SaveList()
    $SListPath = FileSaveDialog("Wählen sie, wo ihre Liste gespeichert werden soll:", @DesktopDir, "Textdateien (*.txt)" , 0, "", $Form1)
    _FileCreate($SListPath)
    $SListFile = FileOpen($SListPath, 2)
    For $i = 1 to _GUICtrlListView_GetItemCount($ListView1)
    $SListItem = _GUICtrlListView_GetItemTextArray($ListView1, $i - 1)
    FileWriteLine($SListFile, $SListItem[2]&"|"&$SListItem[3])
    Next
    FileCLose($SListFile)
    endfunc

    [/autoit]
    Updates:

    Updates:
    -Anzeige des Statusses der einzelnen Items 
    -Die Items lassen sich nun auch in einer formatierten TXT speichern 
    -Liste lässt sich jetzt auch per TXT Datei laden ;) Wie die TXT-Datei formatiert sein muss, steht weiter unten! 

    -Fehlerkorrektur: Item-Nr. wurden nach dem Löschen eines Items nicht geupdatet! Fehler behoben! 
    -Fehlerkorrektur: Das Item Array wurde durch _ArrayDelete() gekürzt, jedoch nicht wieder aufgefüllt! Fehler behoben (thx@SEuBo)!

    Was noch kommt:

    Was noch kommt:
    -Anzeige des Kopierfortschritts in Statusbar
    -Bessere Datei/Ordnerauswahl (über TreeView z.B. einige Dateien wegmarkieren, die nicht kopiert werden sollen)
    -Kontextmenüs mit wichtigen Informationen
    -möglicherweise Fehlerkorrekturen? (bei mir klappt alles grad wunderbar!)
    -Design

    Formatierungsanleitung:

    Formatierung der TXT-Dateien:
    Bsp.(jeweils ohne die Zahl und ""):
    1. Quellpfad|Zielpfad "C:\User\XXX\Desktop\Programme|C:\User\XXX\Desktop\TEST" (kopiert den Inhalt von "Programme" in den Ordner "TEST")
    2. Quellpfad|Zielpfad "C:\User\XXX\Desktop\Docs\abcde.doc|C:\User\XXX\Desktop\TEST" (kopiert die Datei "abcde.doc" aus "Docs" in den "TEST" Ordner)
    3. usw.


    Ich bitte darum dieses Skript nur zum ausführen, lernen oder verbessern (damit ich was lerne xP) zu benutzen. Bitte nehmt zur Kenntnis das es moralisch verwerflich ist das Skript jemand anderes zu nehmen und es als eures auszugeben!

    beste Grüße, sondaschuela69

    17 Mal editiert, zuletzt von sondaschuela69 (19. August 2010 um 22:02) aus folgendem Grund: UPDATE

  • also erstmal ist es egal ob "konforme" variablen oder nicht, viele leute benutzen für progs den Koda form designer.
    Da sind dann ja auch die bestimmtennamen drin ( input1 gui1 etc.)
    Sonst möchte ich noch darauf hinweisen, das so ein programm schon ein bisschen Phantasy benötigt(was manche hier nicht haben).
    Mein Fazit:
    Gut
    Besser
    Besser gehts nicht ( meine meinung):
    :thumbup: :thumbup: :thumbup:

  • danke ;) schön das es dir gefällt!

    Tipps und Verbesserungsvorschläge (auch Fehlerkorrekturen oder auch nur Bugs) hör ich gerne!

    beste grüße

  • ein vorschlag wäre, wenn du die möglichkeit gibst, das kopierte per Button klick in eine datei einzubinden , und die dann abspeichern(abspeichern mit

    [autoit]

    FileSaveDialog($variable, Parameter)

    [/autoit]


    Mfg

  • ein vorschlag wäre, wenn du die möglichkeit gibst, das kopierte per Button klick in eine datei einzubinden , und die dann abspeichern


    wie meinst du das? Nach dem kopieren nochmal ein SaveDialog? Oder redest du iwie von einer Art Log?

  • Ich meine, das man die möglichkeit, die datei, in eine bestehende datei zu kopieren, und die möglichkeit zu geben, eine zu erstellen in die das kopierte eingefügt wird ;)

  • sorry ich steh heut ein bisschen auf dem Schlauch^^

    Habs jetzt so verstanden:
    1. eine Datei durch eine mit gleichem Namen ersetzen? (gibts einfach Haken bei der checkbox machen)
    2. EInen Ordner erstellen, in den die Dateien dann reinkopiert werden? (gibts, bei der Ordnerauswahl "Neuer Ordner erstellen")

    aber ich glaube das wars immer noch nich^^ erkläür mal am Beispiel wie du das meinst^^

  • Hallo.
    Das Programm an sich läuft ganz gut.
    Ein paar Verbesserungsvorschläge hätte ich schon:
    1. Wenn kopiert wird, den Status auf Am kopieren o.Ä. setzten, anstatt auf Warte...
    2. ListView Kontextmenü mit diversen nützlichen Einträgen.
    3. Button zum Abbruch des Kopiervorgangs.

    Mein Fazit: Es ist ein gutes Programm, welches keine Fehler enthält (Ich fand zumindest keine).
    MfG. PrideRage

    Meine Projekte:
    ClipBoard Manager (beendet)
    Gutes ClipBoard Verwaltungs Programm mit nützlichen Funktionen.

    HTML Creator (beendet)
    Nützliches Tool um schnell ein eigenes HTML Dokument zu erstellen.

  • Dankeschön für die Vorschläge ;)

    Also:

    1. Hab ich jetzt gelöst hatte vorher die "_GUICtrlListView_SetItemText" Funktion verwendet das hat nicht hingehauen. Habs durch GUCtrlSetData ersetzt und müsste jetzt klappen ;)

    2. Das ist ne super Idee werde ich angehen nachdem ich die verbesserte Fileauswahl geschafft habe ;)

    3. Da muss ich mich noch belesen wie das geht. Ich benutze ja "xcopy" dabei mir die Funktion DirCopy nicht funktionierte.

    beste Grüße, sondaschuela69

  • Frage wenn ich versuche das Script zu starten wenn

    #include <GetFilesFolder_Rekursiv.au3>

    inkludiert ist, kommt die Meldung

    Error: Error opening the file

    Ohne lässt es sich starten, hierbei eine Frage/Anregung.

    Wäre es möglich hier eine Liste zu laden, zB von einer txt datei im Format:

    c:\test.jpg
    c:\test2.jpg

    bzw.

    c:\test.jpg, c:\test2.jpg?

    Ich habe sowas schon vergeblich überall gesucht und dies sollte mit autoit möglich sein.

  • auch eine super Idee werde ich gleich meinem kleinen Plan hinzufügen ;)
    das #include <GetFilesFolder_Rekursiv.au3> musst du erstmal im Include Ordner haben ;) Es funktioniert aber trotzdem wenn du das Script kompilierst! Habe es trotzdem rausgenommen da es nur ein Überbleibsel früherer Versuche war^^


    also hier ist auch einmal die erste Fehlerkorrektur:

    Nach dem Löschen eines Items aus der Liste haben sich die Zahlen nicht geupdatet, dieser Fehler ist BEHOBEN!!

    Bei weiteren Programmfehlern bitte das Problem hier melden!

    beste Grüße, sondaschuela69

    2 Mal editiert, zuletzt von sondaschuela69 (16. August 2010 um 20:49)

  • Glaubst das mit dem Laden der Liste ist morgen oder übermorgen fertig?

    Sonst muss ich mir selbst was suchen oder basteln :(

    Import und Export wäre glaub ich sicher keine schlechte Idee,
    eventuell sogar eine History wo man dann zB 2 Arbeitsvorgänge zurückgehen könnte.

  • kann ich dir noch nich sagen :/ muss grad etwas fürm schule machen also sicher bin ich mir da nich!

  • IDee zur Ergänzung:

    Log das bei Fehler ausgegeben wird und eventuell in eine Datei geschrieben wird,
    damit man weiss welche Dateien nicht vorhanden waren oder überschrieben werden mussten.

    Option für Überschreiben ev. fix definieren oder je nach Bedarf

  • Das zweite Update:

    Es ist nun möglich, eine TXT-Datei mit entsprechender Formatierung (siehe oben) in die Liste einzufügen! Dank dieses Imports ist es auch möglich einzelne Dateien zu kopieren (was ja leider bei der normalen Auswahl nicht klappt, da man nur Ordner auswählen kann, ist aber auch in Arbeit).

    Die Funktion, eine Liste zu speichern ist ebenfalls in Arbeit!


    @cobra98

    Fehlerlog:
    Ich denke ein Log ist nicht nötig, da die Dateien, bei denen das Programm einen Fehler bemerkt hat, auch mit "Fehler" markiert werden.

    Überschreiben:
    Diese Idee verlangt vertiefendere Kenntnisse mit xCopy, die ich mir erst noch aneignen muss (mach ich noch). Ich muss leider auf xcopy zurückgreifen da die Funktion DirCopy() nicht funktioniert.
    Wenn du in deiner Liste jedoch Dateien zu kopieren drinstehen hast, läuft dasProg über FileCopy(). Werde dafür eine Überschreibungsmöglichkeit einbauen ;)

  • UPDATE:
    Die Funktion, eine Liste zu speichern, ist fertig!
    FileCopy() und FileMove() zum kopieren von Dateien (bisher nur durch importierte Liste möglich, mit dem Programm selbst können bis jetzt nur Ordner und Unterverzeichnisse+Dateien kopiert werden).

    beste Grüße, sondaschuela69