Kopiert eine vorhandene Datei in eine neue Datei und benachrichtigt die Anwendung über eine Callback-Funktion über ihren Fortschritt
#include <WinAPIFiles.au3>
_WinAPI_CopyFileEx ( $sExistingFile, $sNewFile [, $iFlags = 0 [, $pProgressProc = 0 [, $pData = 0]]] )
$sExistingFile | Der Name der existierenden Datei. |
$sNewFile | Der Name der neuen Datei. |
$iFlags | [optional] Die Flags welche angeben wie die Datei kopiert werden soll. Dieser Wert kann eine Kombination der folgenden Werte sein: $COPY_FILE_ALLOW_DECRYPTED_DESTINATION (0x0008) (Ein Versuch, eine verschlüsselte Datei zu kopieren, ist auch dann erfolgreich, wenn die Zielkopie nicht verschlüsselt werden kann.) $COPY_FILE_COPY_SYMLINK (0x0800) (Wenn es sich bei der Quelldatei um einen symbolischen Link handelt, ist die Zieldatei auch ein symbolischer Link, der auf dieselbe Datei verweist, auf die der symbolische Quelllink verweist.) $COPY_FILE_FAIL_IF_EXISTS (0x0001) (Der Kopiervorgang schlägt sofort fehl, wenn die Zieldatei bereits vorhanden ist.) $COPY_FILE_NO_BUFFERING (0x1000) (Die Kopieroperation wird unter Verwendung ungepufferter E/A ausgeführt, wobei die System-E/A-Cache-Ressourcen umgangen werden. Empfohlen für sehr große Dateiübertragungen.) $COPY_FILE_OPEN_SOURCE_FOR_WRITE (0x0004) (Die Datei wird kopiert und die Originaldatei wird für den Schreibzugriff geöffnet.) $COPY_FILE_RESTARTABLE (0x0002) (Der Fortschritt der Kopie wird in der Zieldatei nachverfolgt, falls die Kopie fehlschlägt. Die fehlgeschlagene Kopie kann zu einem späteren Zeitpunkt erneut gestartet werden, indem dieselben Werte für lpExistingFileName und lpNewFileName wie für den fehlgeschlagenen Aufruf angegeben werden. Dies kann den Kopiervorgang erheblich verlangsamen, da die neue Datei während des Kopiervorgangs mehrmals geleert wird.) |
$pProgressProc | [optional] Die Adresse einer Callback-Funktion, die jedes Mal aufgerufen wird, wenn ein anderer Teil der Datei kopiert wurde. (Siehe MSDN für mehr Informationen) |
$pData | [optional] Zeiger auf ein Argument, das an die RCallback-Funktion übergeben werden soll. Kann NULL sein. |
Erfolg: | True. |
Fehler: | False. Es ist _WinAPI_GetLastError() aufzurufen um erweiterte Fehlerinformationen zu erhalten. |
$COPY_* , $PROGRESS_* Konstanten benötigen #include <APIFilesConstants.au3>
Suche nach CopyFileEx in der MSDN Bibliothek.
#include <APIFilesConstants.au3>
#include <Misc.au3>
#include <WinAPIError.au3>
#include <WinAPIFiles.au3>
Opt('TrayAutoPause', 0)
Local $hProgressProc = DllCallbackRegister('_ProgressProc', 'bool', 'uint64;uint64;uint64;uint64;dword;dword;handle;handle;ptr')
FileDelete(@TempDir & '\Test*.tmp')
ProgressOn('_WinAPI_CopyFileEx()', 'Erstellung einer großen Datei...', '')
Local $sFile = @TempDir & '\Test.tmp'
Local $hFile = FileOpen($sFile, 2)
For $i = 1 To 1000000
FileWriteLine($hFile, " ")
Next
FileClose($hFile)
ProgressOn('_WinAPI_CopyFileEx()', 'Kopieren...', '0%')
If Not _WinAPI_CopyFileEx($sFile, @TempDir & '\Test1.tmp', 0, DllCallbackGetPtr($hProgressProc)) Then
_WinAPI_ShowLastError('Fehler beim kopieren ' & $sFile)
EndIf
DllCallbackFree($hProgressProc)
ProgressOff()
FileDelete(@TempDir & '\Test*.tmp')
Func _ProgressProc($iTotalFileSize, $iTotalBytesTransferred, $iStreamSize, $iStreamBytesTransferred, $iStreamNumber, $iCallbackReason, $hSourceFile, $hDestinationFile, $pData)
#forceref $iStreamSize, $iStreamBytesTransferred, $iStreamNumber, $iCallbackReason, $hSourceFile, $hDestinationFile, $pData
Local $iPercent = Round($iTotalBytesTransferred / $iTotalFileSize * 100)
If $iPercent = 100 Then
ProgressSet($iPercent, '', 'Fertig')
Else
ProgressSet($iPercent, $iPercent & '%')
EndIf
Sleep(10) ; Kopierprozess verlangsamen, um die Progressbar zu sehen
If _IsPressed('1B') Then
Return $PROGRESS_CANCEL
Else
Return $PROGRESS_CONTINUE
EndIf
EndFunc ;==>_ProgressProc