Au sujet de l'API CoyFileEx

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Au sujet de l'API CoyFileEx

Message par pat »

Bonjour à tous,
Je cherche à exploiter l'API CoyFileEx.
Cette API comporte plusieurs paramètres.
Mon but est de savoir comment faire pour connaître la progression d'une copie d'un fichier et de pouvoir arrêter la copie d'un fichier en cours.
Pour cela j'ai fait une structure pour les paramètres CopyProgress et j'ai envoyé l'adresse du premier élément de la structure au paramètre pour la CopyProgress.
J'ai également mis le flag à #True pour arrêter la copie pour le paramètre Cancel de l'API.
Sans résultat.
Je me demande si la fonction fonctionne sous PB.
Je ne peux hélas vous donner d'exemple mais merci de m'indiquer les clés pour pouvoir réussir ce que je cherche à faire.
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Re: Au sujet de l'API CoyFileEx

Message par Geo Trouvpatou »

Salut.

Regardes les procédures "BackgroundTransfert" de la Droopy lib

Bye.
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Au sujet de l'API CoyFileEx

Message par lepiaf31 »

Voilà un petit code vite fais :

Code : Tout sélectionner

Procedure CopyProgressRoutine(TotalFileSize.q, TotalBytesTransferred.q, StreamSize.q, StreamBytesTransferred.q, dwStreamNumber.l, dwCallbackReason.l, hSourceFile.l, hDestinationFile.l, lpData.i)
  SetGadgetAttribute(7, #PB_ProgressBar_Maximum, TotalFileSize) ;on fixe le maximum de la ProgressBar
  
  SetGadgetState(7, TotalBytesTransferred) ;on actualise la ProgressBar
EndProcedure

OpenWindow(0, 0, 0, 500, 200, "Test CopyFileEx", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(0, 10, 10, 150, 20, "Fichier source;")
StringGadget(1, 10, 30, 150, 20, "")
ButtonGadget(2, 170, 25, 100, 30, "Parcourir ...")
TextGadget(3, 10, 60, 150, 20, "Fichier cible:")
StringGadget(4, 10, 80, 150, 20, "")
ButtonGadget(5, 170, 75, 100, 30, "Parcourir ...")
TextGadget(6, 20, 110, 150, 20, "Avancement:")
ProgressBarGadget(7, 20, 130, 400, 30, 0, 0)
ButtonGadget(8, 20, 165, 100, 30, "GO")

quit = 0
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 2 ;parcourir le fichier source
          source.s = OpenFileRequester("Ouvrir", "", "*.*", -1)
          If source
            SetGadgetText(1, source)
          EndIf
        Case 5 ;parcourir le fichier cible
          cible.s = SaveFileRequester("Enregistrer", "", "*.*", -1)
          If cible
            SetGadgetText(4, cible)
          EndIf
        
        Case 8 ;GO
          source.s = GetGadgetText(1)
          cible.s = GetGadgetText(4)
          If source And cible
            CopyFileEx_(source, cible, @CopyProgressRoutine(), 0, 0, 1) ;on lance la copie
          EndIf
      EndSelect
    Case #PB_Event_CloseWindow
      quit = 1
  EndSelect
Until quit

End
Dis moi si tu ne comprends pas quelque chose.
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Au sujet de l'API CopyFileEx

Message par pat »

Merci GeoTrouvPatou.
Mais je ne sais pas ce que c'est que le "BackgroundTransfert" de la Droopy lib.
Merci de m'expliquer.
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Au sujet de l'API CopyFileEx

Message par pat »

Merci lepiaf31 pour ton programme.
Je ne l'ai pas encore testé mais déjà je vois certaines choses.
Dans la fonction CopyFileEx il y a un paramètre qui est Cancel, c'est-à-dire la possibilité d'arrêter la copie en cours de route et pour cela le paramètre doit avoir le flag #True.
Je ne la vois pas et je ne vois pas le flag mis. Tu mets 0 à la place.
Mais tu m'as donné les clés pour avancer également dans ce domaine. J'avais pas pensé à faire ce que fait ton programme. Pourtant c'est très simple.
Un grand merci à toi pour ton aide et ton programme.
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Au sujet de l'API CoyFileEx

Message par lepiaf31 »

Si tu veux pouvoir annuler la copie, il faut threadé tout ça. Voilà ce que j'ai fait :

Code : Tout sélectionner

Procedure CopyProgressRoutine(TotalFileSize.q, TotalBytesTransferred.q, StreamSize.q, StreamBytesTransferred.q, dwStreamNumber.l, dwCallbackReason.l, hSourceFile.l, hDestinationFile.l, lpData.i)
  SetGadgetAttribute(7, #PB_ProgressBar_Maximum, TotalFileSize) ;on fixe le maximum de la ProgressBar
 
  SetGadgetState(7, TotalBytesTransferred) ;on actualise la ProgressBar
  If PeekI(lpData) = #True ;on annule
    ProcedureReturn 1 ;#PROGRESS_CANCEL
  Else
    ProcedureReturn 0 ;#PROGRESS_CONTINUE
  EndIf
EndProcedure

Procedure thread_copy(*annuler)
  source.s = GetGadgetText(1)
  cible.s = GetGadgetText(4)
  If source And cible
    If CopyFileEx_(source, cible, @CopyProgressRoutine(), *annuler, 0, 1) ;on lance la copie
      MessageRequester("Terminé", "Copie terminée")
    Else
      MessageRequester("Erreur", "Copie annulée !")
    EndIf
    SetGadgetText(8, "GO")
    SetGadgetState(7, 0)
  EndIf
  copieEnCours = 0
EndProcedure

OpenWindow(0, 0, 0, 500, 200, "Test CopyFileEx", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(0, 10, 10, 150, 20, "Fichier source;")
StringGadget(1, 10, 30, 150, 20, "")
ButtonGadget(2, 170, 25, 100, 30, "Parcourir ...")
TextGadget(3, 10, 60, 150, 20, "Fichier cible:")
StringGadget(4, 10, 80, 150, 20, "")
ButtonGadget(5, 170, 75, 100, 30, "Parcourir ...")
TextGadget(6, 20, 110, 150, 20, "Avancement:")
ProgressBarGadget(7, 20, 130, 400, 30, 0, 0)
ButtonGadget(8, 20, 165, 100, 30, "GO")

Global copieEnCours = 0 ;indique si une copie est en cours
annuler.l = #False ;quand cette variable pas  à True, on annule le copie

quit = 0
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 2 ;parcourir le fichier source
          source.s = OpenFileRequester("Ouvrir", "", "*.*", -1)
          If source
            SetGadgetText(1, source)
          EndIf
        Case 5 ;parcourir le fichier cible
          cible.s = SaveFileRequester("Enregistrer", "", "*.*", -1)
          If cible
            SetGadgetText(4, cible)
          EndIf
       
        Case 8 ;GO / Annuler
          If copieEnCours = 0
            annuler = #False
            copieEnCours = 1
            SetGadgetText(8, "Annuler")
            CreateThread(@thread_copy(), @annuler)
          Else
            annuler = #True
            Delay(500)
            copieEnCours = 0
          EndIf
      EndSelect
    Case #PB_Event_CloseWindow
      quit = 1
  EndSelect
Until quit

End
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Au sujet de l'API CopyFileEx

Message par pat »

Merci lepiaf31 pour la suite.
Je peux dire que, grâce à toi, j'ai réussi à faire le Progress Bar. Cela fonctionne parfaitement bien.
J'ai bien compris que la CopyFileEx rafraîchissait constamment les paramètres que l'on peut retrouver dans la procédure.
Je vais donc étudier ce que tu m'as donné au sujet de l'annulation de la copie.
Merci encore à toi.
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Au sujet de l'API CoyFileEx

Message par lepiaf31 »

De rien =)
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Au sujet de l'API CopyFileEx

Message par pat »

Encore une fois super. Ca marche très bien l'annulation de la copie.
A noter que le dernier paramètre de la CopyFileEx je mets 0 à la place du 1.
Tous ces progrès grâce à lepiaf31.
1000 merci à lui.
Répondre