UDF > WinAPIEx > Files & Devices > Files >


_WinAPI_CopyFileEx

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]]] )

Paramètres

$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

Valeur de retour

Succès: Retourne True.
Échec: Retourne False, appelez _WinAPI_GetLastError() pour obtenir des informations sur l'erreur

Remarque

Les constantes $COPY_*, $PROGRESS_* nécessitent #include <APIFilesConstants.au3>

Voir aussi

Consultez CopyFileEx dans la librairie MSDN.

Exemple

#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