Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :

Nono40.developpez.com
Le petit coin du web de Nono40
SOURCES TESTS DELPHI WIN32 AUTOMATISMES DELPHI .NET QUICK-REPORT
Retour à l'accueil
30 - UTILISATION DE COPYFILEEX

PRÉSENTATION : Demonstration de l'utilisation de la fonction API CopyFileEx avec une procédure de rappel.
ZIP : Téléchargez le zip APERÇUS :

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 et 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.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -