Dateien ohne Ordnerstruktur kopieren

  • Hallo! Ich würde gerne mit Autoit ein Script schreiben, dass Bilder von der Speicherkarte meiner Digicam auf meine Festplatte kopiert. Die Digicam legt die Bilder in verschiedene Unterordner für die verschiedenen Tage ab aber auf dem PC sollen die Bilder dann alle in einem Ordner sein, d.h. die Ordnerstruktur soll nicht mitkopiert werden sondern eben nur die Dateien. Komme nur noch irgendwie noch nicht so richtig mit Autoit zurecht ^^ Kann mir da jemand helfen? Grüße

    Einmal editiert, zuletzt von Quable (2. April 2010 um 19:14)

  • Im Prinzip brauchst du nur das hier (von BugFix):

    Spoiler anzeigen
    [autoit]

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc

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

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit]


    Um die Dateien auch aus den Unterverzeichnissen auszulesen.
    Danach musst du nur noch alle Dateien mit FileCopy in ein beliebiges Verzeichnis kopieren.

  • ich habs dir mal gebastelt:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    $quellpfad = FileSelectFolder("Quellpfad Wählen", "")
    $zielpfad = FileSelectFolder("Zielpfad Wählen", "") & "\"
    $arr = _FL2Arr($quellpfad, "*.jpg")
    For $i = 0 To UBound($arr) - 1
    FileCopy($arr[$i], $zielpfad)
    Next
    Msgbox(0,"","Fertig")

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

    Func _FL2Arr($sStDir, $sPat = '*', $iFlag = 0)
    Local $cSQueue = ObjCreate("System.Collections.Queue")
    If @error Then Return SetError(1, 1, -1)
    Local $cRetQu = ObjCreate("System.Collections.Queue")
    If @error Then Return SetError(1, 2, -1)
    Local $FFFF, $FFNF, $sDir

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

    $sPat = StringReplace($sPat, "\", "\\")
    $sPat = StringReplace($sPat, ".", "\.")
    $sPat = StringReplace($sPat, "*", ".*")
    $sPat = '^' & $sPat & '$'

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

    If StringRight($sStDir, 1) = '\' Then $sStDir = StringTrimRight($sStDir, 1)
    If Not FileExists($sStDir) Then Return SetError(2, 0, "")
    If Not ($iFlag = 0 Or $iFlag = 1 Or $iFlag = 2) Then Return SetError(3, 0, "")

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

    $cSQueue.Enqueue($sStDir)

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

    While $cSQueue.Count > 0
    $sDir = $cSQueue.Dequeue
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    $cSQueue.Enqueue($sDir & '\' & $FFNF)
    If $iFlag <> 1 And StringRegExp($FFNF, $sPat) Then $cRetQu.Enqueue($sDir & '\' & $FFNF)
    Else
    If $iFlag < 2 And StringRegExp($FFNF, $sPat) Then $cRetQu.Enqueue($sDir & '\' & $FFNF)
    EndIf
    Until 0
    EndIf
    WEnd

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

    If $cRetQu.Count > 0 Then
    Return $cRetQu.ToArray
    Else
    Local $Ret[1] = [0]
    Return $Ret
    EndIf
    EndFunc ;==>_FL2Arr

    [/autoit]
  • Schnitzel big thx genau so hab ich mir des vorgestellt :) Noch eine Frage: Wenn im Zielordner schon ein paar von den zu Kopierenden Dateien da sind überschreibt das Script dann jedes Mal die Dateien nochmal oder fügt des dann nur noch die neuen Bilder dazu?

  • er überschreibt sie nicht und fügt einfach die neuen hinzu
    (dachte mir das is das sinnvollste ^^ )

    wenn er sie überschreiben soll dann änder einfach das hier :

    [autoit]

    FileCopy($arr[$i], $zielpfad)

    [/autoit]

    in das um:

    [autoit]

    FileCopy($arr[$i], $zielpfad, 1)

    [/autoit]
  • Jo stimmt schon so dasses nicht nochmal alles überschreibt :) Wollte nur nochmal sicher gehen

  • Das selbe Problem wurde >>hier<< schonmal besprochen.
    Folgendes sollte effektiver sein als erst die ganze Ordnerstruktur in ein Array einzulesen:

    Spoiler anzeigen
    [autoit]

    CopyPics("D:\Bilder", "C:\Bilder", "*.jpg")

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

    ;by AspirinJunkie
    Func CopyPics($sStDir, $sTargDir, $sPat)
    Local $cSQueue = ObjCreate("System.Collections.Queue")
    If @error Then Return SetError(1, 1, -1)
    Local $FFFF, $FFNF, $sDir

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

    If StringRight($sStDir, 1) = '\' Then $sStDir = StringTrimRight($sStDir, 1)
    If Not FileExists($sStDir) Then Return SetError(2, 0, "")

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

    $sPat = StringReplace($sPat, "\", "\\")
    $sPat = StringReplace($sPat, ".", "\.")
    $sPat = StringReplace($sPat, "*", ".*")
    $sPat = '^' & $sPat & '$'

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

    $cSQueue.Enqueue($sStDir)

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

    While $cSQueue.Count > 0
    $sDir = $cSQueue.Dequeue
    $FFFF = FileFindFirstFile($sDir & '\*')
    If $FFFF <> -1 Then
    Do
    $FFNF = FileFindNextFile($FFFF)
    If @error Then ExitLoop
    If @extended Then
    $cSQueue.Enqueue($sDir & '\' & $FFNF)
    Else
    If StringRegExp($FFNF, $sPat) Then FileCopy($sDir & '\' & $FFNF, $sTargDir & '\' & $FFNF, 9)
    EndIf
    Until 0
    EndIf
    WEnd
    EndFunc

    [/autoit]

    Schnitzel
    Ich habe das RückgabeArray der FL2Arr() bewusst 0-basiert gehalten damit For-In ermöglicht wird.
    Ich persönlich finde es daher so etwas übersichtlicher:

    [autoit]

    $arr = _FL2Arr($quellpfad, "*.jpg")

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

    For $i In $arr
    FileCopy($i, $zielpfad)
    Next

    [/autoit]

    3 Mal editiert, zuletzt von AspirinJunkie (2. April 2010 um 22:48)