begin process at 2010 02 10 09:30:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > COPYFILEEX ET PROGRESSBAR

COPYFILEEX ET PROGRESSBAR


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :9 401 / 789

Auteur : Nono40

Ecrire un message privé
Site perso
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.c om

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec une capture TAUX D'OCCUPATION DU PROCESSEUR
Source avec Zip SYNCHRONISER DEUX LISTBOX
Source avec Zip Source avec une capture SUPPRIMER LE SCINTILLEMENT AVEC DOUBLEBUFFERED
SETFOCUS SUR UN BOUTON D'UN RADIOGROUP
Source avec Zip DESSINER DANS LE SYSTRAY AVEC CREATEICON

 Sources de la même categorie

Source avec Zip NEXTGENS -> UNITÉS DE TYPES ÉVOLUÉS NOUVELLE GÉNÉRATION (DE... par f0xi
Source avec Zip Source avec une capture AUTO-COMPLÉTION D'UN CONTRÔLE DE SAISIE par Bacterius
Source avec Zip CARDS GAME SDK 1.0.0.0 par f0xi
Source avec Zip Source avec une capture TRAYICON - VOTRE ICONE DANS LA BARRE DES TACHES par Bacterius
Source avec Zip Source avec une capture WINHIDER _ CACHER UN PROGRAMME DE L'ÉCRAN ET DE LA BARRE DE ... par soldier8514

Commentaires et avis

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.

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

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

Commentaire de cyrille le 28/12/2004 17:32:22

c'est ok sous windows NT

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

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,952 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales