Copyfileex et progressbar

Soyez le premier à donner votre avis sur cette source.

Vue 14 209 fois - Téléchargée 1 146 fois

Description

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

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
mercredi 7 septembre 2005
Statut
Membre
Dernière intervention
23 septembre 2005

Je travaille sous winXP PRO SP2
J'ai tester copyfileEx avec un PROGRESS_STOP et une reprise. Et là surprise, la copie reprend, mais elle reprend du début du fichier!!???
Comprend pas?
Messages postés
47
Date d'inscription
mardi 18 décembre 2001
Statut
Membre
Dernière intervention
17 février 2006

c'est ok sous windows NT
Messages postés
962
Date d'inscription
mercredi 3 avril 2002
Statut
Membre
Dernière intervention
12 septembre 2006
2
Non, ce n'est pas adaptable pour windows 95,98 et Me car la fonction CopyFileEx n'est pas définie dans windows...
Messages postés
235
Date d'inscription
vendredi 25 avril 2003
Statut
Membre
Dernière intervention
26 juillet 2010

Super ! Mais est-ce adaptable pour W95 et W98 ( C'est pour faire une appli dans un lycée)
Merci
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
31
Suggestion :
Pour obtenir un message d'erreur plus parlant que '120', je suggère que l'on mette :
RaiseLastWin32Error
à la place :
ShowMessage(IntToStr(GetLastError));
RaiseLastWin32Error renvoie un message indiquant le code erreur mais aussi un message donnant la nature de l'erreur.

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.