• Hy,

    als ich dein _MultiFilecopy gefunden hab war ich ganz froh, weil ich anfangs so etwas selbst basteln wollte :D
    Nur leider bekomme ich einen Fehler beim testen, wenn ichs nur einbinde und nicht benutze?

    Code
    U:\Utilities\_MultiFileCopy.au3 (203) : ==> The requested action with this object has failed.:
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    _ShowSubFolders($oFSO.GetFolder($sPath)^ ERROR

    edit: hmmm jetz funktionierts einwandfrei... ich hab nichts verändert :huh:

    Einmal editiert, zuletzt von Metzlmane (19. August 2009 um 11:21)

    • Offizieller Beitrag

    Auch wenn es jetzt funktioniert.
    Wenn Du nochmal eine Fehlfunktion feststellst, bitte möglichst viele Angaben zur möglichen Fehlerquelle machen. Dazu gehören:
    - Welches Betriebssystem?
    - Ausführung als Script oder compilierte Exe?
    - Wie rufst Du die Funktion auf (am besten Dein Script posten)?
    - Welche Fehlermeldung erscheint (die hast Du ja gepostet)?

    So kann man dann leichter nachvollziehen, wie und warum dort ein Fehler auftritt. :)

  • Als Erstes mal ein Lob an den Ersteller, die UDF ist super.
    Nun würde ich diese allerdings auch gern zum verschieben von Daten nutzen.
    Gibt es eine einfache möglichkeit den _MFC zum "_MFM" zu ändern?
    Ich denke es wird nur ein Parameter sein den ich nicht sehe (noob).

    Vielen Dank im Voraus

    • Offizieller Beitrag

    Verschieben ist ja quasi nur ein kopieren und anschließendes löschen der Datei, also musst Du die folgenden Zeilen:

    [autoit]


    $ret = DllCall($DllKernel32, 'int', 'CopyFileExA', 'str', $aSource[$i], 'str', $aReturn[$i], 'ptr', $ptr, 'str', $sArray, 'int', 0, 'int', 0)
    ;~ ConsoleWrite('Return: ' & $ret[0] & @LF)
    If $ret[0] = 0 Then $aMFC[10] = True
    $aMFC[8] += FileGetSize($aSource[$i])

    [/autoit]

    durch diese hier ersetzen:

    [autoit]


    $ret = DllCall($DllKernel32, 'int', 'CopyFileExA', 'str', $aSource[$i], 'str', $aReturn[$i], 'ptr', $ptr, 'str', $sArray, 'int', 0, 'int', 0)
    ;~ ConsoleWrite('Return: ' & $ret[0] & @LF)
    $aMFC[8] += FileGetSize($aSource[$i])
    If $ret[0] = 0 Then
    $aMFC[10] = True
    Else
    FileDelete($aSource[$i])
    EndIf

    [/autoit]
  • Danke Oscar,

    wenn ich die Funktion folgender Maßen aufrufe:

    Code
    _MultiFileCopy("C:\Temp1\*.txt", "C:\Temp2\")

    bekomme ich folgende Fehlermeldung:

    Code
    E:\Systemdateien\Desktop\_MultiFileCopy.au3 (172) : ==> The requested action with this object has failed.:
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    _ShowSubFolders($oFSO.GetFolder($sPath)^ ERROR

    Mein OS ist Win7 x64 und dei Ausführung erfolgt aus SCITE.

    Wenn ich die Funktion folgender Maßen aufrufe:

    Code
    _MultiFileCopy('C:\Temp1\', 'C:\Temp2\')

    läuft alles


    @progandy
    könntest du evtl. aufzeigen was für MoveFileEx anzupassen wäre?
    Ich bin da nicht so fit.

    2 Mal editiert, zuletzt von Nighthawk (7. September 2009 um 18:46)

  • Hallo, habe ein paar veränderungen gemacht an MFC,

    er ließt jetzt schneller die Verzeichnisse ein. und zeigt die Anzahl der Dateien an, die kopiert wurden.
    Außerdem ist es jetzt eine DOS-Eingabe, kann aber natürlich auch rausgenommen werden.

    Zeile 53 - 58 dann einfach auskommentieren.

    Vielleicht kann das mal einer testen? Bei mir funktioniert das ganz gut.


    [autoit]

    ;===werden benötigt=============================================================
    #include<String.au3>
    #include<Misc.au3>
    #include<array.au3>
    Global $strFiles = '', $strSize = 0, $anzgesamt = 0, $anz = 0
    ;===============================================================================

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

    #cs
    ;===Beispiel 1 (erstellen der Datei "!copydata.mfc" im Quellverzeichnis)========
    Global $sSourcePath = 'C:\Programme\AutoIt3\Examples\'

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

    Global $aReturn = _MultiFileCopy($sSourcePath)

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

    MsgBox(0, 'MFC', '"!copydata.mfc" wurde erstellt!')
    ;===============================================================================

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

    ;===Beispiel 2 (komplettes Verzeichnis kopieren)================================
    ; Alle Dateien und Unterverzeichnisse (rekursiv) werden kopiert
    ; Verzeichnisstruktur der Quelle wird übernommen
    Global $sSourcePath = 'C:\Programme\AutoIt3\Examples\'
    Global $sDestinationPath = @ScriptDir & '\Tmp1'; Zielpfad (wird ggf. erstellt)

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

    Global $aReturn = _MultiFileCopy($sSourcePath, $sDestinationPath, False)
    ;===============================================================================

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

    ;===Beispiel 3 (mehrere Dateien kopieren)=======================================
    ; Alle Dateien aus dem Array werden ins Zielverzeichnis kopiert
    ; Array[0] muss die Anzahl der zu kopierenden Dateien enthalten
    Global $aSource[4] = [3, @SystemDir & '\shell32.dll', @SystemDir & '\mspaint.exe', @SystemDir & '\eula.txt']
    Global $sDestinationPath = @ScriptDir & '\Tmp2'; Zielpfad (wird ggf. erstellt)

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

    Global $aReturn = _MultiFileCopy($aSource, $sDestinationPath, False)
    ;===============================================================================
    #ce

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

    ;===============================================================================
    ; Function Name: _MultiFileCopy
    ; Description:: Kopiert mehrere Dateien mit Progressbar
    ; Parameter(s): Array mit Dateien zum kopieren oder Quellpfad,
    ; Zielpfad,
    ; überschreiben? [True/False],
    ; Wenn überschreiben = True, dann PreFix zum überschreiben
    ; Return Value(s): Array mit den kopierten Dateien
    ; Requirement(s): Global $strFiles = '', $strSize = 0
    ; #include<String.au3>
    ; #include<Misc.au3>
    ; Author(s): Tom99, progandy, eukalyptus and Oscar (http://www.autoit.de)
    ;===============================================================================

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

    If $CMDLINE[0] <> 2 Then
    MsgBox(0,"", "Fehler, keine oder falsche Parameter angegeben")
    exit
    else
    _MultiFileCopy($CMDLINE[1], $CMDLINE[2])
    endif

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

    Func _MultiFileCopy($aSource, $sDestPath = '', $bOverWrite = True, $sPreFix = '!Copy')
    Local $oldGUICloseOnESC = Opt('GUICloseOnESC', 0)
    Local $ret, $sShowSource, $sShowDest, $sSourcePath = '', $sNewFolder = '', $k
    Local $aMFC[12] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, False, DllOpen('user32.dll')]
    If IsArray($aSource) Then
    If Not IsNumber($aSource[0]) Then Return SetError(1, 0, 0)
    For $i = 1 To $aSource[0]
    $aMFC[7] += FileGetSize($aSource[$i])
    Next
    Else
    $sSourcePath = $aSource
    If StringRight($sSourcePath, 1) <> '\' Then $sSourcePath &= '\'
    $strSize = 0
    ToolTip('Bitte warten! Verzeichnis wird eingelesen!', @DesktopWidth / 2 - 100, 10)
    If FileExists($sSourcePath & '!copydata.mfc') And $sDestPath <> '' Then
    Local $sFile = StringTrimRight(FileRead($sSourcePath & '!copydata.mfc'), 2)
    $strSize = DirGetSize($aSource)
    ;$strSize = StringLeft($sFile, StringInStr($sFile, @CRLF) - 1)
    $aSource = StringSplit(StringTrimLeft($sFile, StringInStr($sFile, @CRLF) + 1), @CRLF, 1)
    Else
    If FileExists($sSourcePath & '!copydata.mfc') Then FileDelete($sSourcePath & '!copydata.mfc')
    $strSize = DirGetSize($aSource)
    $aSource = _RecursiveFileListToArray($sSourcePath, '', 1)
    Local $hFile = FileOpen($sSourcePath & '!copydata.mfc', 2)
    If $hFile <> -1 Then
    FileWriteLine($hFile, $strSize)
    For $i = 1 To $aSource[0]
    FileWriteLine($hFile, $aSource[$i])
    Next
    FileClose($hFile)
    EndIf
    EndIf
    $aMFC[7] = $strSize
    ToolTip('')
    If $sDestPath = '' Then Return SetError(0, 0, 1)
    EndIf
    ;MsgBox(0,"",$aSource[0])
    $anzgesamt = $aSource[0]
    If StringRight($sDestPath, 1) <> '\' Then $sDestPath &= '\'
    If Not FileExists($sDestPath) Then
    If Not DirCreate($sDestPath) Then Return SetError(2, 0, 0)
    EndIf
    $sShowDest = StringRegExpReplace($sDestPath, '(.{3})(.*)(.{50})', '$1' & '[...]' & '$3')
    Local $aReturn = $aSource
    Local $callback = DllCallbackRegister('__Progress', 'int', 'uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;str')
    Local $ptr = DllCallbackGetPtr($callback)
    Local $DllKernel32 = DllOpen('kernel32.dll')
    __ProgressCreate($aMFC)
    $aMFC[9] = TimerInit()
    For $i = 1 To $aSource[0]
    $anz = $anz +1
    $sArray = ''
    For $j = 0 To 11
    $sArray &= $aMFC[$j] & ';'
    Next
    $sFile = StringMid($aSource[$i], StringInStr($aSource[$i], '\', 0, -1) + 1)
    If $sSourcePath <> '' Then
    $sNewFolder = StringTrimLeft(StringLeft($aSource[$i], StringInStr($aSource[$i], '\', 0, -1)), StringLen($sSourcePath))
    If Not FileExists($sDestPath & $sNewFolder) Then
    If Not DirCreate($sDestPath & $sNewFolder) Then Return SetError(3, 0, 0)
    EndIf
    EndIf
    If $sFile = '' Then ContinueLoop
    $k = 0
    While $bOverWrite = False And FileExists($sDestPath & $sNewFolder & $sFile)
    $k += 1
    $sFile = $sPreFix & $k & "_" & StringMid($aSource[$i], StringInStr($aSource[$i], '\', 0, -1) + 1)
    WEnd
    $aReturn[$i] = $sDestPath & $sNewFolder & $sFile
    $sShowSource = StringRegExpReplace($aSource[$i], '(.{3})(.*)(.{50})', '$1' & '[...]' & '$3')
    GUICtrlSetData($aMFC[1], 'Kopiere Datei ' & @CRLF & '"' & $sShowSource & '"' & @CRLF & 'nach: ' & @CRLF & '"' & $sShowDest & '"')
    $ret = DllCall($DllKernel32, 'int', 'CopyFileExA', 'str', $aSource[$i], 'str', $aReturn[$i], 'ptr', $ptr, 'str', $sArray, 'int', 0, 'int', 0)
    ;~ ConsoleWrite('Return: ' & $ret[0] & @LF)
    If $ret[0] = 0 Then $aMFC[10] = True
    $aMFC[8] += FileGetSize($aSource[$i])
    Next
    DllClose($DllKernel32)
    DllCallbackFree($callback)
    GUIDelete($aMFC[0])
    DllClose($aMFC[11])
    Opt('GUICloseOnESC', $oldGUICloseOnESC)
    Return $aReturn
    EndFunc ;==>_MultiFileCopy

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

    Func __Progress($FileSize, $BytesTransferred, $StreamSize, $StreamBytesTransferred, $dwStreamNumber, $dwCallbackReason, $hSourceFile, $hDestinationFile, $lpData)
    Local $aSplit = StringSplit(StringTrimRight($lpData, 1), ";")
    If $aSplit[11] = 'True' Then Return 1
    Local $pos = GUIGetCursorInfo($aSplit[1])
    If _IsPressed('1B', Int($aSplit[12])) Then Return 1
    If _IsPressed('01', Int($aSplit[12])) And ($pos[4] = Int($aSplit[7])) Then Return 1
    Local $sPercent = Round($BytesTransferred / $FileSize * 100, 0), $iTime, $iTotalTime, $iTransferRate
    Local $sPercentAll = Round(($aSplit[9] + $BytesTransferred) / $aSplit[8] * 100, 0)
    $iTime = TimerDiff($aSplit[10])
    $iTotalTime = Ceiling($iTime / 1000 / ($sPercentAll + 0.1) * 100)
    $iTransferRate = _StringAddThousandsSep(Int($aSplit[8] / $iTotalTime / 1000), '.', ',')
    GUICtrlSetData($aSplit[3], $sPercent & ' %')
    GUICtrlSetData($aSplit[5], $sPercent)
    GUICtrlSetData($aSplit[4], $sPercentAll & ' % Zeit: ' & Int($iTime / 1000) & '/' & $iTotalTime & ' s ' & $anz & '/' & $anzgesamt & ' (' & $iTransferRate & ' KB/s)')
    GUICtrlSetData($aSplit[6], $sPercentAll)
    ;$anz = $anz + 1
    EndFunc ;==>__Progress

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

    Func __ProgressCreate(ByRef $aMFC)
    If Not IsDeclared('WS_POPUPWINDOW') Then Local Const $WS_POPUPWINDOW = 0x80880000
    If Not IsDeclared('WS_EX_TOPMOST') Then Local Const $WS_EX_TOPMOST = 0x00000008
    If Not IsDeclared('WS_EX_TOOLWINDOW') Then Local Const $WS_EX_TOOLWINDOW = 0x00000080
    If Not IsDeclared('WS_EX_COMPOSITED') Then Local Const $WS_EX_COMPOSITED = 0x02000000
    $aMFC[0] = GUICreate('MultiFileCopy', 520, 220, @DesktopWidth - 520, 20, $WS_POPUPWINDOW, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_COMPOSITED))
    $aMFC[1] = GUICtrlCreateLabel('', 10, 10, 500, 65)
    GUICtrlSetFont(-1, 10, 400, 0, 'Courier New')
    GUICtrlCreateLabel('Datei:', 10, 83, 60, 16)
    GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
    $aMFC[2] = GUICtrlCreateLabel('0 %', 80, 83, 500, 16)
    GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
    $aMFC[4] = GUICtrlCreateProgress(10, 100,500, 20)
    GUICtrlCreateLabel('Gesamt:', 10, 133, 60, 16)
    GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
    $aMFC[3] = GUICtrlCreateLabel('0 %', 80, 133, 440, 16)
    GUICtrlSetFont(-1, 11, 600, 0, 'Courier New')
    $aMFC[5] = GUICtrlCreateProgress(10, 150, 500, 20)
    $aMFC[6] = GUICtrlCreateButton('Abbrechen', 200, 185, 75, 25)
    GUICtrlSetFont(-1, 9, 400, 0, 'Arial')
    GUISetState()
    EndFunc ;==>__ProgressCreate

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Anpassung: Verzeichnisgröße ermitteln für _MultiFileCopy ($strSize)
    ; 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
    $strSize += $file.size
    $strFiles &= $file.Path & $Delim
    EndIf
    Else
    $strSize += $file.size
    $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][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;===============================================================================
    ; Function Name: _RecursiveFileListToArray($sPath[, $sPattern][, $iFlag][, $iFormat][, $iRecursion][, $sDelim])
    ; Description:: gibt Verzeichnisse (rekursiv) und/oder Dateien zurück, die einem RegExp-Pattern entsprechen
    ; Parameter(s): $sPath = Startverzeichnis
    ; $sPattern = ein beliebiges RexExp-Pattern für die Auswahl
    ; $iFlag = Auswahl
    ; 0 = Dateien & Verzeichnisse
    ; 1 = nur Dateien
    ; 2 = nur Verzeichnisse
    ; $iFormat = Rückgabeformat
    ; 0 = String
    ; 1 = Array mit [0] = Anzahl
    ; 2 = Nullbasiertes Array
    ; $iRecursion = Verzeichnisse rekursiv durchsuchen
    ; 0 = Nein
    ; 1 = Ja
    ; $sDelim = Trennzeichen für die String-Rückgabe
    ; Requirement(s): AutoIt 3.3.0.0
    ; Return Value(s): Array/String mit den gefundenen Dateien/Verzeichnissen
    ; Author(s): Oscar (http://www.autoit.de)
    ; Anregungen von: bernd670 (http://www.autoit.de)
    ;===============================================================================
    Func _RecursiveFileListToArray($sPath, $sPattern = '', $iFlag = 0, $iFormat = 1, $iRecursion = 1, $sDelim = @CRLF)
    Local $hSearch, $sFile, $sReturn = ''
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Or $hSearch = -1 Then Return SetError(1, 0, $sReturn)
    While True
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($sPath & $sFile), 'D') Then
    If StringRegExp($sPath & $sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 2) Then $sReturn &= $sPath & $sFile & '\' & $sDelim
    If $iRecursion Then $sReturn &= _RecursiveFileListToArray($sPath & $sFile & '\', $sPattern, $iFlag, 0)
    ContinueLoop
    EndIf
    If StringRegExp($sFile, $sPattern) And ($iFlag = 0 Or $iFlag = 1) Then $sReturn &= $sPath & $sFile & $sDelim
    WEnd
    FileClose($hSearch)
    If $iFormat And $sReturn = '' Then Return StringSplit($sReturn, '', $iFormat)
    If $iFormat Then Return StringSplit(StringTrimRight($sReturn, StringLen($sDelim)), $sDelim, $iFormat)
    Return $sReturn
    EndFunc

    [/autoit]
  • Hey all,

    sorry dass ich dieses ältere Thema wieder ausgrabe, aber sind die Entwickler von diesem Thread noch aktiv?
    Ich mein speziell die entwickler des Scripts auf der 1. Seite dieses Threads

    Spoiler anzeigen

    Tom99, progandy, eukalyptus, Oscar und BugFix


    Ich hätte da evtl noch eine Anregung/Herausforderung für euch. Ich selbst bin leider (noch) nicht mächtig
    genug das allein zu bewerkstelligen :( 8|

    mfG Lottich

    • Offizieller Beitrag

    Der Author ist Oscar und auch noch aktiv.
    Wenn du ein Anliegen hast, dann schreib es doch einfach in den Thread oder schicke eine PN an Oscar.

  • Kannst du das Skript für die Version 3.3.8.1 lauffähig machen :?:
    Wäre es möglich noch den Status optional in der Taskleistedarzustellen :?: