Share via


Fonction MoveFileExA (winbase.h)

Déplace un fichier ou un répertoire existant, y compris ses enfants, avec diverses options de déplacement.

La fonction MoveFileWithProgress est équivalente à la fonction MoveFileEx , sauf que MoveFileWithProgress vous permet de fournir une fonction de rappel qui reçoit des notifications de progression.

Pour effectuer cette opération en tant qu’opération traitée, utilisez la fonction MoveFileTransacted .

Syntaxe

BOOL MoveFileExA(
  [in]           LPCSTR lpExistingFileName,
  [in, optional] LPCSTR lpNewFileName,
  [in]           DWORD  dwFlags
);

Paramètres

[in] lpExistingFileName

Nom actuel du fichier ou du répertoire sur l’ordinateur local.

Si dwFlags spécifie MOVEFILE_DELAY_UNTIL_REBOOT, le fichier ne peut pas exister sur un partage distant, car des opérations différées sont effectuées avant que le réseau soit disponible.

Par défaut, le nom est limité à MAX_PATH caractères. Pour étendre cette limite à 32 767 caractères larges, ajoutez « \\ ?\ » au chemin d’accès. Pour plus d’informations, consultez Nommage de fichiers, de chemins et d’espaces de noms.

Conseil

À compter de Windows 10, version 1607, vous pouvez choisir de supprimer la limitation MAX_PATH sans précédencer « \\ ?\ ». Pour plus d’informations, consultez la section « Limitation maximale de la longueur du chemin d’accès » de Naming Files, Paths et Namespaces .

[in, optional] lpNewFileName

Nouveau nom du fichier ou du répertoire sur l’ordinateur local.

Lors du déplacement d’un fichier, la destination peut se trouver sur un autre système de fichiers ou un autre volume. Si la destination se trouve sur un autre lecteur, vous devez définir l’indicateur MOVEFILE_COPY_ALLOWED dans dwFlags.

Lors du déplacement d’un répertoire, la destination doit se trouver sur le même lecteur.

Si dwFlags spécifie MOVEFILE_DELAY_UNTIL_REBOOT et que lpNewFileName a la valeur NULL, MoveFileEx inscrit le fichier lpExistingFileName à supprimer au redémarrage du système. Si lpExistingFileName fait référence à un répertoire, le système supprime le répertoire au redémarrage uniquement si le répertoire est vide.

Par défaut, le nom est limité à MAX_PATH caractères. Pour étendre cette limite à 32 767 caractères larges, ajoutez « \\ ?\ » au chemin d’accès. Pour plus d’informations, consultez Nommage de fichiers, de chemins et d’espaces de noms.

Conseil

À compter de Windows 10, version 1607, vous pouvez choisir de supprimer la limitation MAX_PATH sans précédencer « \\ ?\ ». Pour plus d’informations, consultez la section « Limitation maximale de la longueur du chemin d’accès » de Naming Files, Paths et Namespaces .

[in] dwFlags

Ce paramètre peut prendre une ou plusieurs des valeurs suivantes.

Valeur Signification
MOVEFILE_COPY_ALLOWED
2 (0x2)
Si le fichier doit être déplacé vers un autre volume, la fonction simule le déplacement à l’aide des fonctions CopyFile et DeleteFile .

Si le fichier est correctement copié dans un autre volume et que le fichier d’origine ne peut pas être supprimé, la fonction réussit à laisser le fichier source intact.

Cette valeur ne peut pas être utilisée avec MOVEFILE_DELAY_UNTIL_REBOOT.

MOVEFILE_CREATE_HARDLINK
16 (0x10)
Réservé pour un usage futur.
MOVEFILE_DELAY_UNTIL_REBOOT
4 (0x4)
Le système ne déplace pas le fichier tant que le système d’exploitation n’est pas redémarré. Le système déplace le fichier immédiatement après l’exécution d’AUTOCHK, mais avant de créer des fichiers de pagination. Par conséquent, ce paramètre permet à la fonction de supprimer les fichiers de pagination des start-ups précédentes.

Cette valeur ne peut être utilisée que si le processus se trouve dans le contexte d’un utilisateur qui appartient au groupe Administrateurs ou au compte LocalSystem.

Cette valeur ne peut pas être utilisée avec MOVEFILE_COPY_ALLOWED.

MOVEFILE_FAIL_IF_NOT_TRACKABLE
32 (0x20)
La fonction échoue si le fichier source est une source de lien, mais que le fichier ne peut pas être suivi après le déplacement. Cette situation peut se produire si la destination est un volume mis en forme avec le système de fichiers FAT.
MOVEFILE_REPLACE_EXISTING
1 (0x1)
Si un fichier nommé lpNewFileName existe, la fonction remplace son contenu par le contenu du fichier lpExistingFileName , à condition que les exigences de sécurité relatives aux listes de contrôle d’accès (ACL) soient remplies. Pour plus d’informations, consultez la section Remarques de cette rubrique.

Si lpNewFileName nomme un répertoire existant, une erreur est signalée.

MOVEFILE_WRITE_THROUGH
8 (0x8)
La fonction ne retourne pas tant que le fichier n’est pas réellement déplacé sur le disque.

La définition de cette valeur garantit qu’un déplacement effectué en tant qu’opération de copie et de suppression est vidé sur le disque avant le retour de la fonction. Le vidage se produit à la fin de l’opération de copie.

Cette valeur n’a aucun effet si MOVEFILE_DELAY_UNTIL_REBOOT est défini.

Valeur retournée

Si la fonction réussit, la valeur de retour est différente de zéro.

Si la fonction échoue, la valeur de retour est égale à zéro (0). Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError.

Remarques

Si le paramètre dwFlags spécifie MOVEFILE_DELAY_UNTIL_REBOOT, MoveFileEx échoue s’il 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

Cette valeur de Registre est de type REG_MULTI_SZ. Chaque opération de renommage stocke l’une des chaînes null suivantes, selon qu’il s’agit d’une suppression ou non :

  • szDstFile\0\0
  • szSrcFile\0szDstFile\0
La chaîne szDstFile\0\0 indique que le fichier szDstFile doit être supprimé au redémarrage. La chaîne szSrcFile\0szDstFile\0 indique que szSrcFile doit être renommé szDstFile lors du redémarrage.
Note Bien que \0\0 ne soit techniquement pas autorisé dans un nœud REG_MULTI_SZ , cela peut être dû au fait que le fichier est considéré comme renommé en nom null.
 
Le système utilise ces entrées de Registre pour effectuer les opérations au redémarrage dans le même ordre qu’elles ont été émises. Par exemple, le fragment de code suivant crée des entrées de Registre qui suppriment szDstFile et renomment szSrcFile en szDstFile au redémarrage :
MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT);

Étant donné que les opérations de déplacement et de suppression réelles spécifiées avec l’indicateur MOVEFILE_DELAY_UNTIL_REBOOT ont lieu une fois que l’application appelante a cessé d’exécuter, la valeur de retour ne peut pas refléter la réussite ou l’échec du déplacement ou de la suppression du fichier. Au lieu de cela, il reflète la réussite ou l’échec de la saisie des entrées appropriées dans le Registre.

Le système supprime un répertoire marqué pour suppression avec l’indicateur MOVEFILE_DELAY_UNTIL_REBOOT uniquement s’il est vide. Pour garantir la suppression des répertoires, déplacez ou supprimez tous les fichiers du répertoire avant de tenter de le supprimer. Les fichiers peuvent se trouver dans le répertoire au moment du démarrage, mais ils doivent être supprimés ou déplacés avant que le système puisse supprimer le répertoire.

Les opérations de déplacement et de suppression sont effectuées au moment du démarrage dans le même ordre qu’elles sont spécifiées dans l’application appelante. Pour supprimer un répertoire contenant des fichiers au moment du démarrage, supprimez d’abord les fichiers.

Si un fichier est déplacé d’un volume à l’autre, MoveFileEx ne déplace pas le descripteur de sécurité avec le fichier. Le descripteur de sécurité par défaut est attribué au fichier dans le répertoire de destination.

La fonction MoveFileEx coordonne son fonctionnement avec le service de suivi des liens, afin que les sources de liens puissent être suivies à mesure qu’elles sont déplacées.

Pour supprimer ou renommer un fichier, vous devez disposer d’une autorisation de suppression sur le fichier ou d’une autorisation enfant dans le répertoire parent. Si vous configurez un répertoire avec tous les accès à l’exception de la suppression et de la suppression d’enfants et que les listes de contrôle d’accès des nouveaux fichiers sont héritées, vous devez être en mesure de créer un fichier sans pouvoir le supprimer. Toutefois, vous pouvez ensuite créer un fichier et obtenir tous les accès que vous demandez sur le handle qui vous est retourné au moment de la création du fichier. Si vous demandez l’autorisation de suppression au moment de la création du fichier, vous pouvez supprimer ou renommer le fichier avec ce handle, mais pas avec n’importe quel autre handle. Pour plus d’informations, consultez Sécurité des fichiers et droits d’accès.

Dans Windows 8 et Windows Server 2012, cette fonction est prise en charge par les technologies suivantes.

Technologie Prise en charge
Protocole Server Message Block (SMB) 3.0 Oui
Basculement transparent SMB 3.0 (TFO) Oui
SMB 3.0 avec partages de fichiers avec montée en puissance parallèle (SO) Oui
Système de fichiers du volume partagé de cluster (CsvFS) Oui
Système de fichiers résilient (ReFS) Oui
 

Exemples

Pour obtenir un exemple, consultez Création et utilisation d’un fichier temporaire.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows XP [applications de bureau | applications UWP]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau | applications UWP]
Plateforme cible Windows
En-tête winbase.h (inclure Windows.h)
Bibliothèque Kernel32.lib
DLL Kernel32.dll

Voir aussi

CopyFile

DeleteFile

Fonctions de gestion des fichiers

Sécurité du fichier et droits d’accès

GetWindowsDirectory

MoveFileTransacted

MoveFileWithProgress

WritePrivateProfileString