NOTES :
Ce programme montre l'utilisation de la fonction CopyFileEx avec une fonction de rappel ( CallBack ).
Cette fonction est utilisée pour mettre à jour un ProgressBar.
Ce programme a été testé et amélioré par DelphiProg.
Attention : CopyFileEx n'est pas compatible avec Windows95, Windows98 et WindowsMe.
Il a été testé avec Windows 2000 mais doit fonctionner avec WindowsNT et Windows XP.
CODE :
// // Programme de démonstration de la fonction CopyFileEx // // Par DelphiProg delphiprog@fr.fm // et Nono40 nono40.fr.st // // 21/01/2003 : rédaction par Nono40 // 22/01/2003 : tests et améliorations par Delphiprog //
Procedure TForm1.Button2Click(Sender: TObject); Begin If OpenDialog1.Execute Then
Edit1.Text := OpenDialog1.FileName; End;
Procedure TForm1.Button3Click(Sender: TObject); Begin If SaveDialog1.Execute Then
Edit2.Text := SaveDialog1.FileName; End;
// Fonction "CallBack" appelée par CopyFileEx pour signaler l'avancement de la copie Function CopyCallBack(
TotalFileSize: LARGE_INTEGER; // Taille totale du fichier en octets
TotalBytesTransferred: LARGE_INTEGER; // Nombre d'octets déjàs transférés
StreamSize: LARGE_INTEGER; // Taille totale du flux en cours
StreamBytesTransferred: LARGE_INTEGER; // Nombre d'octets déjà tranférés dans ce flus
dwStreamNumber: DWord; // Numéro de flux actuel
dwCallbackReason: DWord; // Raison de l'appel de cette fonction
hSourceFile: THandle; // handle du fichier source
hDestinationFile: THandle; // handle du fichier destination
ProgressBar : TProgressBar // paramètre passé à la fonction qui est une // recopie du paramètre passé à CopyFile Ex // Il sert à passer l'adresse du progress bar à // mettre à jour pour la copie. C'est une // excellente idée de DelphiProg
): DWord; far; stdcall; Var
EnCours: Int64; Begin // Calcul de la position du progresbar en pourcent, le calcul doit être effectué dans // une variable intermédiaire de type Int64. Pour éviter les débordement de calcul // dans la propriété Position de type integer.
EnCours := TotalBytesTransferred.QuadPart * 100 Div TotalFileSize.QuadPart; If ProgressBar<>NilThen ProgressBar.Position := EnCours; // La fonction doit définir si la copie peut être continuée.
Result := PROGRESS_CONTINUE; End;
Procedure TForm1.Button1Click(Sender: TObject); Var Retour: LongBool; Begin If (Edit1.Text = '') Or (Edit2.Text = '') Or (Edit1.Text = Edit2.Text) Then
Exit; If FileExists(Edit2.Text) And
(MessageDlg('Le fichier de destination existe, voulez-vous le remplacer ?',
mtconfirmation, [mbYes, mbNo], 0) <> mrYes) Then
Exit;
Retour := False; IfNot CopyFileEx(
PChar(Edit1.Text), // Nom du fichier d'origine
PChar(Edit2.Text), // Nom du fichier de destination
@CopyCallBack, // Adresse de la fonction appelée durant la copie
ProgressBar1, // Paramètre auxiliaire qui sert ici à définir le progress bar // à mettre à jour [DelphiProg]
@Retour, // adresse d'une variable booléène que la fonction teste // en permanence pour éventuellement stopper la copie
COPY_FILE_RESTARTABLE) // Si la copie est stoppée, un nouvel appel avec les mêmes // paramètres permet de la continuer Then ShowMessage(IntToStr(GetLastError)); End;