Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COPYFILEEX ET PROGRESSBAR


Information sur la source

Catégorie :API Niveau : Initié Date de création : 22/01/2003 Date de mise à jour : 03/05/2003 02:21:23 Vu / téléchargé: 8 820 / 760

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

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

  • // 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;
// 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
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Delphiprog le 23/01/2003 13:55:37 administrateur CS

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.

signaler à un administrateur
Commentaire de magicvinni le 23/01/2003 16:49:21

Super ! Mais est-ce adaptable pour W95 et W98 ( C'est pour faire une appli dans un lycée)
Merci

signaler à un administrateur
Commentaire de Nono40 le 23/01/2003 22:07:19

Non, ce n'est pas adaptable pour windows 95,98 et Me car la fonction CopyFileEx n'est pas définie dans windows...

signaler à un administrateur
Commentaire de cyrille le 28/12/2004 17:32:22

c'est ok sous windows NT

signaler à un administrateur
Commentaire de cyrilh7 le 23/09/2005 12:15:15

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?

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,250 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.