Per Drag & Drop Dateien Umbenennen und in jeweilige Verzeichnisse kopieren

  • Hallo Gemeinde.

    Bin so recht neu in diesem Forum und im Bereich des Proggens.

    Ich würde gerne ein Programm bauen, welche auf einer Form abgegrenzte Bereiche hat, auf denen ich aus dem Explorer per Drag & Drop Dateien ziehen kann und die Dateien dann Umbenannt werden und einfach in ein bestimmtes Verzeichnis kopiert werden.

    Geht das mit AutoIt und hat jemand eine Idee wie. Das übersteigt einfach mein Wissen. ;(

    Sorry das ich soviel frage. Danke aber schon mal im Vorraus

  • Brauchst dich nicht zu entschuldigen ;)
    Dafür sind wie doch da :)

    Edit: Wenn es Probleme gibt, dann einfach nen Thread aufmachen ..^^

  • Naja es gibt auch andere Foren, in denen das manchmal nicht so ist.

    Und wie der Teufel es so will raffe ich das Beispiel im Moment nicht so wirklich.

    Ich weiß nicht wo ich da ansetzen muß um mein Programm umzusetzen.

    ;(

  • Ich glaub es scheitert gerade an mir. Ich raffs nicht. Hab jetzt auch noch ein Skript von Oscar hier gefunden. Also die Funktion des Drag & Drop funktioniert. Nur ich weiß nicht wie und wie ich diese Funktion nun benutzen kann, die gedropte Datei in das passende Verzeichnis zu kopieren.

    Das ist bisher mein Gehversuch beziehungsweise weiß ich noch nicht wie es richtig funktioniert:

    ?( ?( ;( ;(

  • So erhältst du das genaue Ziel auf der GUI:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>

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

    Global $gaDropFiles[1], $iDropItem = -1
    Global $WM_DROPFILES = 0x233

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

    GUICreate("CopyIt", 241, 312, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1, 0x00000018); WS_EX_ACCEPTFILES
    $file = GUICtrlCreateGroup("Kopieren in Verzeichnis 1", 16, 16, 209, 113)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    $file2 = GUICtrlCreateGroup("Kopieren in Verzeichnis 2", 16, 146, 209, 113)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    GUISetState()
    GUIRegisterMsg($WM_DROPFILES, 'WM_DROPFILES_FUNC')

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $GUI_EVENT_DROPPED
    Switch @GUI_DropId
    Case $file
    _ArrayDisplay($gaDropFiles, "--1-- Kopie nach Verzeichnis --1--")
    Case $file2
    _ArrayDisplay($gaDropFiles, ">>2<< Kopie nach Verzeichnis >>2<<")
    EndSwitch
    EndSwitch
    WEnd

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

    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName
    Local $nAmt = DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', 0xFFFFFFFF, 'ptr', 0, 'int', 0)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', $i, 'ptr', 0, 'int', 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate('wchar[' & $nSize & ']')
    DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', $i, 'ptr', DllStructGetPtr($pFileName), 'int', $nSize)
    ReDim $gaDropFiles[$i + 1]
    $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

    [/autoit]
  • Hallo zusammen. Ich komme hier auch leider nicht weiter. Ich komm mit der Funktion überhaupt nicht klar. Ich weiß grad nicht wo ich ansetzen muß um irgendwie mein Vorhaben umzusetzen und die Dateien zumindest in einen vorgegebenen Ordner zu kopieren. Wie komme ich denn an die Dateinamen aus dem Array dran um überhaupt die Dateien zu kopiern.

    Ich weiß, jeder halbwegs gescheite Schimpanse kapiert das, aber ich glaub ich ich bin zu blöde ;( ;(

    Hilfe ;(

  • Noch einmal ich mit meinem Problemfall.

    Bin immernoch nicht auf eine Lösung gekommen. Habe rumprobiert aber es geht nix.

    Kann das denn weiterhelfen wenn ich das array in die Zwischenablage kopiere oder zu einem String send. Nur wie bekomme ich das hin. Also auch wenn es mehrere Dateien sind.

    Also anstelle von

    Code
    _ArrayDisplay($gaDropFiles, "--1-- Kopie nach Verzeichnis --1--")

    so

    Code
    _ArrayToClip($gaDropFiles, "--1-- Kopie nach Verzeichnis --1--")

    Den Code für den _ArrayToString krieg ich eh nich zum laufen ?(

  • Wieso funktioniert denn _Arraytostring nicht?
    Aus der Hilfe:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

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

    Dim $avArray[20]

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

    ; Populate test array.
    For $i = 0 to UBound( $avArray ) - 1
    $avArray[$i] = Random( -20000, 20000, 1)
    Next

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

    _ArrayDisplay($avArray, "$avArray")

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

    MsgBox(0, "_ArrayToString() getting $avArray items 1 to 7", _ArrayToString($avArray, @TAB, 1, 7))

    [/autoit]

    Nochmal zur Aufgabenstellung:
    1. Gui erstellen
    2. Beliebige Dateien per Drag & Drop daraufziehen (Anzeige mit Orginalnamen oder nach dem Umbenennen?)
    3. Dateien umbenennen (nach welchem Muster? einfach etwas anhängen?)
    4. Umbenannte Dateien in ein vordefiniertes Verzeichnis kopieren (Per Button alle Dateien auf der Gui oder direkt beim Dropevent?)

    Ist das so richtig? Wenn du noch die Fragen beantwortest mach ich heute mittag ein kommentiertes Beispiel.

    Einmal editiert, zuletzt von nuts (10. September 2009 um 15:45)

  • Nee so hatte ich das gemeint. _ArrayToString funktioniert. Aber ich kann da irgendwie nichts mit anstellen. also das liegt an mir das es nicht funktioniert.

    Hinzu habe ich die Dateinamen in nen String aber wie kann ich diesen dann nun zum Kopieren benutzen. Und der delimiter funktioniert nicht.


    Code
    _ArrayToString($gaDropFiles,"|"))
  • Ok tut mir leid mein Fehler. Also gesamten Code anbei

    Also so wie es scheint klappt das auch soweit mit nur einer Datei. Aber nicht wenn ich mehrer Dateien auf habe.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    Global $gaDropFiles[1], $iDropItem = -1
    Global $WM_DROPFILES = 0x233
    GUICreate("CopyIt", 241, 312, @DesktopWidth / 2 - 160, @DesktopHeight / 2 - 45, -1, 0x00000018); WS_EX_ACCEPTFILES
    $file = GUICtrlCreateGroup("Kopieren in Verzeichnis 1", 16, 16, 209, 113)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    $file2 = GUICtrlCreateGroup("Kopieren in Verzeichnis 2", 16, 146, 209, 113)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    GUISetState()
    GUIRegisterMsg($WM_DROPFILES, 'WM_DROPFILES_FUNC')
    $Zielverzeichnis = "C:Temp\

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $GUI_EVENT_DROPPED
    Switch @GUI_DropId
    Case $file
    MsgBox(0, "Zu kopierende Dateien Test 1", _ArrayToString($gaDropFiles,"|"))
    FileCopy(_ArrayToString($gaDropFiles),$Zielverzeichnis)
    Case $file2
    MsgBox(0, "Zu kopierende Dateien Test 2", _ArrayToString($gaDropFiles,"|"))
    FileCopy(_ArrayToString($gaDropFiles),$Zielverzeichnis)
    EndSwitch
    EndSwitch
    WEnd

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

    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName
    Local $nAmt = DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', 0xFFFFFFFF, 'ptr', 0, 'int', 0)
    For $i = 0 To $nAmt[0] - 1

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

    $nSize = DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', $i, 'ptr', 0, 'int', 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate('wchar[' & $nSize & ']')
    DllCall('shell32.dll', 'int', 'DragQueryFileW', 'hwnd', $wParam, 'int', $i, 'ptr', DllStructGetPtr($pFileName), 'int', $nSize)
    ReDim $gaDropFiles[$i + 1]
    $gaDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0

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

    Next
    EndFunc ;==>WM_DROPFILES_FUNC

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Kopieren musst du jeden Eintrag für sich allein ;) Außerdem musst du zwischen Dateien und Verzeichnissen unterscheiden. Ich hab dir diese Teile mal zusammengebaut, du musst sie nur noch integrieren.

    Spoiler anzeigen
    [autoit]

    $ZielPfad = "C:\Test\Zielpfad" ; Zielpfad

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

    $aKopiereDateien = $gaDropFiles ; Array mit Pfaden von den gedroppten Dateien und Ordnern
    For $i = 0 To UBound($DroppedFiles)-1
    Switch _IsDirectory($DroppedFiles[$i])
    Case True
    DirCopy($DroppedFiles[$i], $ZielPfad & "\" & _LastSegment($DroppedFiles[$i])
    Case False
    FileCopy($DroppedFiles[$i], $ZielPfad & "\" & _LastSegment($DroppedFiles[$i]))
    EndSwitch
    Next

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

    Func _IsDirectory($Path)
    ; Author: Prog@ndy
    Return StringInStr(FileGetAttrib($Path), "D", 1)>0
    EndFunc

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

    Func _LastSegment($sPath, $sDrive="Laufwerk")
    ; Author: Prog@ndy
    $sPath = StringReplace($sPath, "/", "\")
    If StringRegExp($sPath, "\A[A-Za-z]:\\\Z") Then Return $sDrive & " (" & StringLeft($sPath,1) & ")"
    Return StringRegExpReplace($sPath, "\A.*\\([^\\]+)\\*\Z", "$1")
    EndFunc

    [/autoit]