Hi, ich habe einen Script, der auch funktioniert aber ich würde diesen gerne noch etwas optimieren, da er beim Dateien einlesen länger braucht als bestimmt nötig.
AutoIt: _CopyDirWithProgress.au3
#include <Array.au3>
Global $sOriginalDir, $srcDirLen, $aFileList, $sOutPutDIR, $FileName, $sDestDir, $ProgTitleDir, $copydir[0], $fileCount, $fileCounttxt, $iDirSize2 = 0, $iDirSize = 0, $perc
Func _CopyDirWithProgress($sOriginalDir, $sDestDir, $ProgTitleDir, $NASPath)
$fileCount = FileReadLine($NASPath & "\Script\Filecount.txt", 1)
_ArrayAdd($copydir, 8)
_ArrayAdd($copydir, "Archiv")
_ArrayAdd($copydir, "Backups")
_ArrayAdd($copydir, "Briefpapier")
_ArrayAdd($copydir, "DB")
_ArrayAdd($copydir, "Dokumente")
_ArrayAdd($copydir, "Internetmarke")
_ArrayAdd($copydir, "Reports")
_ArrayAdd($copydir, "Zeichnungen")
If StringRight($sOriginalDir, 1) <> '\' Then $sOriginalDir = $sOriginalDir & '\'
If StringRight($sDestDir, 1) <> '\' Then $sDestDir = $sDestDir & '\'
If $sOriginalDir = $sDestDir Then Return -1
ProgressOn($ProgTitleDir, 'Berechne Dateien' & @LF & @LF, 'Bitte warten...', -1, -1, 18)
_FileSearch($copydir, $sOriginalDir, $NASPath)
$fileCount = $aFileList[0]
FileDelete($NASPath & "\Script\Filecount.txt")
FileWrite($NASPath & "\Script\Filecount.txt", $fileCount)
$iDirSize = Round($iDirSize2 / (1024 * 1024), 2)
If $aFileList[0] = 0 Then
ProgressOff()
SetError(1)
Return -1
EndIf
If $sOutPutDIR[0] = 0 Then
ProgressOff()
SetError(1)
Return -1
EndIf
Local $iCopiedSize = 0, $iCopiedSize2 = 0, $fProgress = 0
Local $c, $iOutPut = 0, $sLost = '', $sError
ProgressSet(Int($fProgress * 100), $FileName[1], 'Kopiere Datei:')
For $c = 1 To $aFileList[0]
ProgressSet(Int($fProgress * 100), $FileName[$c] & @LF & $c & ' von ' & $aFileList[0] & ' Dateien Kopiert' & @LF & $iCopiedSize & ' von ' & $iDirSize & ' MB kopiert.', 'Kopiere Datei: ' & Round($fProgress * 100, 2) & ' % - Fertig! ')
If RunWait(@ComSpec & ' /c XCOPY "' & $sOriginalDir & $aFileList[$c] & '" "' & $sDestDir & $sOutPutDIR[$c] & '\" /D /S /V /C /H /R /Y /F /G /I /E >' & @TempDir & '\o.tmp', $sOriginalDir, @SW_HIDE) Then
$sError = FileReadLine(@TempDir & '\o.tmp', 1)
$iOutPut = $iOutPut + 1
$sLost = $sLost & $sOriginalDir & $aFileList[$c] & ' ' & $sError & @CRLF
EndIf
FileDelete(@TempDir & '\o.tmp')
FileSetAttrib($sDestDir & $sOutPutDIR[$c] & $FileName[$c], "+A-RSH") ;<- Comment this line if you do not want attribs reset.
$iCopiedSize2 = $iCopiedSize2 + FileGetSize($sOriginalDir & $aFileList[$c])
$iCopiedSize = Round($iCopiedSize2 / (1024 * 1024), 2)
$fProgress = $iCopiedSize / $iDirSize
$fProgress = $iCopiedSize / $iDirSize
Next
ProgressOff()
If $sLost <> '' Then ;tries to write the log somewhere.
If FileWrite($NASPath & 'notcopied.txt', $sLost) = 0 Then
FileWrite(@DesktopDir & '\notcopied.txt', $sLost)
EndIf
EndIf
Return $iOutPut
EndFunc ;==>_CopyDirWithProgress
Func _FileSearch($sIstr, $sOriginalDir, $NASPath)
Local $sCriteria, $sFP1, $sFP2, $sFP3, $sFP4, $sFP5, $sCF1, $sCF2, $sCF3, $sCF4, $sCF5, $sOD1, $sOD2, $sOD3, $sOD4, $sOD5, $sOTD1, $sOTD2, $sOTD3, $sOTD4, $sOTD5, $sOutPut1 = '', $sOutPut2 = '', $sOutPut3 = '', $Count = 0
If $fileCount = "" Then $fileCount = 3200
$srcDirLen = StringLen($sOriginalDir)
For $c = 1 To $sIstr[0]
$sOD1 = $sOriginalDir & $sIstr[$c] & '\'
$sCriteria = '*.*'
;To begin we seek in the starting path.
$sFP1 = FileFindFirstFile($sOD1 & $sCriteria)
If $sFP1 <> -1 Then
Do
$sCF1 = FileFindNextFile($sFP1)
If @error Then
FileClose($sFP1)
ExitLoop
EndIf
If $sCF1 = '.' Or $sCF1 = '..' Then ContinueLoop
If Not StringInStr(FileGetAttrib($sOD1 & $sCF1), 'd') Then
$sOTD1 = StringTrimLeft($sOD1, $srcDirLen)
$sOutPut1 = $sOutPut1 & $sOTD1 & $sCF1 & @LF
$sOutPut2 = $sOutPut2 & $sOTD1 & @LF
$sOutPut3 = $sOutPut3 & $sCF1 & @LF
$Count = $Count + 1
$perc = $Count / $fileCount
$iDirSize2 = $iDirSize2 + FileGetSize($sOD1 & $sCF1)
ProgressSet(Int($perc * 100), 'Bitte warten...' & @LF & $Count & ' Dateien' & @LF & Round($iDirSize2 / (1024 * 1024), 2) & ' MB', 'Berechne Dateien')
Else
$sOD2 = $sOD1 & $sCF1 & '\'
$sFP2 = FileFindFirstFile($sOD2 & $sCriteria)
If $sFP2 <> -1 Then
Do
$sCF2 = FileFindNextFile($sFP2)
If @error Then
FileClose($sFP2)
ExitLoop
EndIf
If $sCF2 = '.' Or $sCF2 = '..' Then ContinueLoop
If Not StringInStr(FileGetAttrib($sOD2 & $sCF2), 'd') Then
$sOTD2 = StringTrimLeft($sOD2, $srcDirLen)
$sOutPut1 = $sOutPut1 & $sOTD2 & $sCF2 & @LF
$sOutPut2 = $sOutPut2 & $sOTD2 & @LF
$sOutPut3 = $sOutPut3 & $sCF2 & @LF
$Count = $Count + 1
$perc = $Count / $fileCount
$iDirSize2 = $iDirSize2 + FileGetSize($sOD2 & $sCF2)
ProgressSet(Int($perc * 100), 'Bitte warten...' & @LF & $Count & ' Dateien' & @LF & Round($iDirSize2 / (1024 * 1024), 2) & ' MB', 'Berechne Dateien')
Else
$sOD3 = $sOD2 & $sCF2 & '\'
$sFP3 = FileFindFirstFile($sOD3 & $sCriteria)
If $sFP3 <> -1 Then
Do
$sCF3 = FileFindNextFile($sFP3)
If @error Then
FileClose($sFP3)
ExitLoop
EndIf
If $sCF3 = '.' Or $sCF3 = '..' Then ContinueLoop
If Not StringInStr(FileGetAttrib($sOD3 & $sCF3), 'd') Then
$sOTD3 = StringTrimLeft($sOD3, $srcDirLen)
$sOutPut1 = $sOutPut1 & $sOTD3 & $sCF3 & @LF
$sOutPut2 = $sOutPut2 & $sOTD3 & @LF
$sOutPut3 = $sOutPut3 & $sCF3 & @LF
$Count = $Count + 1
$perc = $Count / $fileCount
$iDirSize2 = $iDirSize2 + FileGetSize($sOD3 & $sCF3)
ProgressSet(Int($perc * 100), 'Bitte warten...' & @LF & $Count & ' Dateien' & @LF & Round($iDirSize2 / (1024 * 1024), 2) & ' MB', 'Berechne Dateien')
Else
$sOD4 = $sOD3 & $sCF3 & '\'
$sFP4 = FileFindFirstFile($sOD4 & $sCriteria)
If $sFP4 <> -1 Then
Do
$sCF4 = FileFindNextFile($sFP4)
If @error Then
FileClose($sFP4)
ExitLoop
EndIf
If $sCF4 = '.' Or $sCF4 = '..' Then ContinueLoop
If Not StringInStr(FileGetAttrib($sOD4 & $sCF4), 'd') Then
$sOTD4 = StringTrimLeft($sOD4, $srcDirLen)
$sOutPut1 = $sOutPut1 & $sOTD4 & $sCF4 & @LF
$sOutPut2 = $sOutPut2 & $sOTD4 & @LF
$sOutPut3 = $sOutPut3 & $sCF4 & @LF
$Count = $Count + 1
$perc = $Count / $fileCount
$iDirSize2 = $iDirSize2 + FileGetSize($sOD4 & $sCF4)
ProgressSet(Int($perc * 100), 'Bitte warten...' & @LF & $Count & ' Dateien' & @LF & Round($iDirSize2 / (1024 * 1024), 2) & ' MB', 'Berechne Dateien')
Else
$sOD5 = $sOD4 & $sCF4 & '\'
$sFP5 = FileFindFirstFile($sOD5 & $sCriteria)
If $sFP5 <> -1 Then
Do
$sCF5 = FileFindNextFile($sFP5)
If @error Then
FileClose($sFP5)
ExitLoop
EndIf
If $sCF5 = '.' Or $sCF5 = '..' Then ContinueLoop
$sOTD5 = StringTrimLeft($sOD5, $srcDirLen)
$sOutPut1 = $sOutPut1 & $sOTD5 & $sCF5 & @LF
$sOutPut2 = $sOutPut2 & $sOTD5 & @LF
$sOutPut3 = $sOutPut3 & $sCF5 & @LF
$Count = $Count + 1
$perc = $Count / $fileCount
$iDirSize2 = $iDirSize2 + FileGetSize($sOD5 & $sCF5)
ProgressSet(Int($perc * 100), 'Bitte warten...' & @LF & $Count & ' Dateien' & @LF & Round($iDirSize2 / (1024 * 1024), 2) & ' MB', 'Berechne Dateien')
Until 0
EndIf
EndIf
Until 0
EndIf
EndIf
Until 0
EndIf
EndIf
Until 0
EndIf
EndIf
Until 0
EndIf
Next
If $sOutPut1 = '' And $sOutPut2 = '' And $sOutPut3 = '' Then
MsgBox($MB_SYSTEMMODAL, "", "Es ist etwas schiefgegangen")
Else
$aFileList = StringSplit(StringTrimRight($sOutPut1, 1), @LF)
$sOutPutDIR = StringSplit(StringTrimRight($sOutPut2, 1), @LF)
$FileName = StringSplit($sOutPut3, @LF)
EndIf
EndFunc ;==>_FileSearch
Alles anzeigen