Code : Tout sélectionner
$Source = "Test.1Mo"
$Dest1 = "Test.Copy.5Mo"
$Dest2 = "_Save\Test.5Mo"
DirCreate("_Save")
FileDelete($Source)
FileDelete($Dest1)
FileDelete($Dest2)
; Création d'un fichier de 5Mo
$hFile = FileOpen($Source, 2)
FileSetPos($hFile, 5 * 1024 * 1024, 0)
FileWrite($hFile, 0)
FileClose($hFile)
;;; DLL
Global Const $MOVE_FILE_REPLACE_EXISTSING = 0x00000001
Global Const $MOVE_FILE_COPY_ALLOWED = 0x00000002
Global Const $MOVE_FILE_WRITE_THROUGH = 0x00000008
$Dll = DllOpen("kernel32.dll")
$CallBack = DllCallbackRegister("_CallBack", "int", "uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;str")
; Copy
#comments-start
BOOL WINAPI CopyFileEx(
__in LPCTSTR lpExistingFileName,
__in LPCTSTR lpNewFileName,
__in_opt LPPROGRESS_ROUTINE lpProgressRoutine,
__in_opt LPVOID lpData,
__in_opt LPBOOL pbCancel,
__in DWORD dwCopyFlags
);
#comments-end
ConsoleWrite("Copy" & @LF)
$aDllReturn = DllCall($Dll, "int", "CopyFileExA", _
"str", $Source, "str", $Dest1, _
"ptr", DllCallbackGetPtr($CallBack), _
"str", "CallBack Args", _
"int", 0, "int", 0)
; Move
#comments-start
BOOL WINAPI MoveFileWithProgress(
__in LPCTSTR lpExistingFileName,
__in_opt LPCTSTR lpNewFileName,
__in_opt LPPROGRESS_ROUTINE lpProgressRoutine,
__in_opt LPVOID lpData,
__in DWORD dwFlags
);
#comments-end
ConsoleWrite("Move" & @LF)
$aDllReturn = DllCall($Dll, "int", "MoveFileWithProgressA", _
"str", $Source, "str", $Dest2, _
"ptr", DllCallbackGetPtr($CallBack), _
"str", "CallBack Args", _
"int", $MOVE_FILE_COPY_ALLOWED + $MOVE_FILE_WRITE_THROUGH + $MOVE_FILE_REPLACE_EXISTSING)
DllCallbackFree($CallBack)
DllClose($Dll)
#comments-start
DWORD CALLBACK CopyProgressRoutine(
__in LARGE_INTEGER TotalFileSize,
__in LARGE_INTEGER TotalBytesTransferred,
__in LARGE_INTEGER StreamSize,
__in LARGE_INTEGER StreamBytesTransferred,
__in DWORD dwStreamNumber,
__in DWORD dwCallbackReason,
__in HANDLE hSourceFile,
__in HANDLE hDestinationFile,
__in_opt LPVOID lpData
);
#comments-end
Func _CallBack($FileSize, $BytesTransferred, _
$StreamSize, $StreamBytesTransferred, _
$dwStreamNumber, $dwCallbackReason, _
$hSourceFile, $hDestinationFile, $lpData)
If $dwCallbackReason = 1 Then ConsoleWrite(@TAB & $lpData & @LF)
ConsoleWrite(@TAB & Round($BytesTransferred / $FileSize * 100, 0) & "%" & @LF)
EndFunc ;==>_CallBack