C'est un petit programme de démonstration de l'utilisation de la fonction CopyFileEx avec une procédure de rappel.
Le programme effectue une simple copie de fichier, avec mise à jour d'un progressbar pendant la copie.
Ce programme a été testé ( et amélioré ) par DelphiProg que je remercie particulièrement.
ATTENTION : CopyFileEx n'est pas compatible avec Windows 95,Windows 98 et Windows Me !
Il a été testé sous Windows 2000 mais doit normalement fonctionner avec Windows NT et Windows XP
Source / Exemple :
// 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 actuem
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<>Nil Then 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;
if not 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;
Conclusion :
http://Delphiprog.fr.fm
http://nono40.developpez.com
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.