Page 1 sur 1

Au sujet de l'API CoyFileEx

Publié : mer. 26/mai/2010 11:47
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.

Re: Au sujet de l'API CoyFileEx

Publié : mer. 26/mai/2010 23:25
par Geo Trouvpatou
Salut.

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

Bye.

Re: Au sujet de l'API CoyFileEx

Publié : jeu. 27/mai/2010 10:52
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.

Re: Au sujet de l'API CopyFileEx

Publié : jeu. 27/mai/2010 13:57
par pat
Merci GeoTrouvPatou.
Mais je ne sais pas ce que c'est que le "BackgroundTransfert" de la Droopy lib.
Merci de m'expliquer.

Re: Au sujet de l'API CopyFileEx

Publié : jeu. 27/mai/2010 14:11
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.

Re: Au sujet de l'API CoyFileEx

Publié : jeu. 27/mai/2010 15:39
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

Re: Au sujet de l'API CopyFileEx

Publié : ven. 28/mai/2010 13:37
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.

Re: Au sujet de l'API CoyFileEx

Publié : ven. 28/mai/2010 14:23
par lepiaf31
De rien =)

Re: Au sujet de l'API CopyFileEx

Publié : jeu. 03/juin/2010 13:25
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.