Copie un fichier existant dans un nouveau fichier, en notifiant à l'application la progression grâce à une fonction de rappel
#include <WinAPIFiles.au3>
_WinAPI_CopyFileEx ( $sExistingFile, $sNewFile [, $iFlags = 0 [, $pProgressProc = 0 [, $pData = 0]]] )
$sExistingFile | Le nom d'un fichier existant. |
$sNewFile | Le nom du nouveau fichier. |
$iFlags | [optionnel] Les flags qui spécifient comment le fichier doit être copié. Ce paramètre peut être une combinaison des valeurs suivantes: $COPY_FILE_ALLOW_DECRYPTED_DESTINATION (0x0008) $COPY_FILE_COPY_SYMLINK (0x0800) $COPY_FILE_FAIL_IF_EXISTS (0x0001) $COPY_FILE_NO_BUFFERING (0x1000) $COPY_FILE_OPEN_SOURCE_FOR_WRITE (0x0004) $COPY_FILE_RESTARTABLE (0x0002) |
$pProgressProc | [optionnel] L'adresse d'une fonction de rappel qui sera appelée chaque fois qu'une autre partie du fichier a été copié. (Voir MSDN pour plus d'informations) |
$pData | [optionnel] Pointeur sur l'argument à passer à la fonction de rappel. Peut être NULL |
Succès: | Retourne True. |
Échec: | Retourne False, appelez _WinAPI_GetLastError() pour obtenir des informations sur l'erreur |
Les constantes $COPY_*, $PROGRESS_* nécessitent #include <APIFilesConstants.au3>
Consultez CopyFileEx dans la librairie MSDN.
#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()', 'Création d'un gros fichier...', '') Local $sFile = @TempDir & '\Test.tmp' Local $hFile = FileOpen($sFile, 2) For $i = 1 To 1000000 FileWriteLine($hFile, " ") Next FileClose($hFile) ProgressOn('_WinAPI_CopyFileEx()', 'En cours de copie...', '0%') If Not _WinAPI_CopyFileEx($sFile, @TempDir & '\Test1.tmp', 0, DllCallbackGetPtr($hProgressProc)) Then _WinAPI_ShowLastError('Erreur lors de la copie ' & $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, '', 'Complete') Else ProgressSet($iPercent, $iPercent & '%') Sleep(100) ; Pour ralentir et montrer la progression EndIf If _IsPressed('1B') Then Return $PROGRESS_CANCEL Else Return $PROGRESS_CONTINUE EndIf EndFunc ;==>_ProgressProc