 |
|
 |
|
 |
30 - UTILISATION DE COPYFILEEX
|
|
|
|
PRÉSENTATION :
Demonstration de l'utilisation de la fonction API CopyFileEx avec une procédure de rappel.
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
//
Unit Unit1;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;
Type
TForm1 = Class(TForm)
Edit1: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
Button3: TButton;
ProgressBar1: TProgressBar;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Procedure FormShow(Sender: TObject);
Procedure Button2Click(Sender: TObject);
Procedure Button3Click(Sender: TObject);
Procedure Button1Click(Sender: TObject);
Private
{ Déclarations privées }
Public
{ Déclarations publiques }
End;
Var
Form1: TForm1;
Implementation
{$R *.dfm}
Procedure TForm1.FormShow(Sender: TObject);
Begin
Edit1.Text := '';
Edit2.Text := '';
End;
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<>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;
End.
|
| |
 |
|
 |
Les sources présentées sur cette page sont libres de droits
et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ©
2003 Bruno Guérangé. Aucune reproduction, même partielle, ne peut être
faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc.
sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à
trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.