UDF > WinAPIEx > Files & Devices > Files >


_WinAPI_MoveFileEx

Déplace un fichier ou un répertoire, en notifiant à l'application la progression à travers une fonction de rappel

#include <WinAPIFiles.au3>
_WinAPI_MoveFileEx ( $sExistingFile, $sNewFile [, $iFlags = 0 [, $pProgressProc = 0 [, $pData = 0]]] )

Paramètres

$sExistingFile Le nom du fichier ou du répertoire existant sur l'ordinateur local.

Si $iFlags spécifie $MOVE_FILE_DELAY_UNTIL_REBOOT, le fichier ne peut pas exister sur un partage distant parce que les opérations retardées sont effectuées avant que le réseau soit disponible.
$sNewFile Le nouveau nom du fichier ou du répertoire sur l'ordinateur local.

Lorsque vous déplacez un fichier, $sNewFile peut être sur un système de fichier différent ou un volume différent. Si $sNewFile est sur un autre disque, vous devez activer le flag $MOVE_FILE_COPY_ALLOWED dans le paramètre $iFlags.

Lorsque vous déplacez un répertoire, $sExistingFile et $sNewFile doivent être sur le même disque.

Si $iFlags spécifie $MOVE_FILE_DELAY_UNTIL_REBOOT et $sNewFile est 0, _WinAPI_MoveFileEx() enregistre $sExistingFile pour qu'il soit supprimé lorsque le système redémarre.
Si $sExistingFile concerne un répertoire, le système supprime le répertoire au redémarrage uniquement si le répertoire est vide.
$iFlags [optionnel] Les options de déplacement. Ce paramètre peut prendre une ou plusieurs des valeurs suivantes:
    $MOVE_FILE_COPY_ALLOWED (0x0002)
    $MOVE_FILE_CREATE_HARDLINK (0x0010)
    $MOVE_FILE_DELAY_UNTIL_REBOOT (0x0004)
    $MOVE_FILE_FAIL_IF_NOT_TRACKABLE (0x0020)
    $MOVE_FILE_REPLACE_EXISTING (0x0001)
    $MOVE_FILE_WRITE_THROUGH (0x0008)
$pProgressProc [optionnel] L'adresse de la fonction de rappel qui sera appelée à chaque fois qu'une autre portion du fichier a été déplacé.
(Voir MSDN pour plus d'informations)
$pData [optionnel] Pointeur sur l'argument à passer à la fonction de rappel.

Valeur de retour

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

Remarques

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

Si le paramètre $iFlags spécifie $MOVE_FILE_DELAY_UNTIL_REBOOT, _WinAPI_MoveFileEx() échoue si elle ne peut pas accéder au registre. La fonction stocke les emplacements des fichiers à renommer au redémarrage dans la valeur de registre suivante:
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

Voir aussi

Consultez MoveFileWithProgress 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_MoveFileEx()', '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_MoveFileEx()', 'En cours de déplacement...', '0%')
Sleep(500) ; Pour montrer la modification lors du déplacement sur le même périphérique, seulement renommé

If Not _WinAPI_MoveFileEx($sFile, @TempDir & '\Test1.tmp', $MOVE_FILE_COPY_ALLOWED, DllCallbackGetPtr($hProgressProc)) Then
    _WinAPI_ShowLastError('Erreur lors du déplacement de ' & $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, '', 'Terminé')
    Else
        ProgressSet($iPercent, $iPercent & "%")
        Sleep(100) ; Pour ralentir
    EndIf
    ; Il y a peu de chance de voir quoi que ce soit car, lors d'un déplacement, l'OS modifie le nom du fichier dans la table des fichiers sans copier les clusters

    If _IsPressed('1B') Then
        Return $PROGRESS_CANCEL
    Else
        Return $PROGRESS_CONTINUE
    EndIf
EndFunc   ;==>_ProgressProc