Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Intercepter la jauge de copie de fichiers

10 réponses
Avatar
Gilles
Bonjour,

fCopieFichier fonctionne, mais sur de gros fichiers, l'absence de jauge
est problématique.

frJauge en paramètre est bien gentil mais c'est anti ergonomique
(présence d'un bouton annuler problématique), et mal intégré à
l'application.


Avez vous une idée pour faire la copie en recevant par événément par
exemple la quantité copiée?

Merci,

Gilles.


PS : il est exclu de coder soit même la copie par flit/fecrit, c'est
très très inférieur en performances, quelle que soit la taille du
buffer (qui en plus peut varier d'une machine à l'autre)

10 réponses

Avatar
Gilles
Après mure réflexion, Gilles a écrit :
Bonjour,

fCopieFichier fonctionne, mais sur de gros fichiers, l'absence de jauge est
problématique.



Pour ceux que ça interesse, j'ai fini par le faire avec l'API et une
callback de fonction Windev.
C'est performant, interruptible, on peut mettre en pause et
reprendre...
Avatar
JeAn-PhI
Gilles a formulé la demande :
Après mure réflexion, Gilles a écrit :
Bonjour,

fCopieFichier fonctionne, mais sur de gros fichiers, l'absence de jauge est
problématique.



Pour ceux que ça interesse, j'ai fini par le faire avec l'API et une callback
de fonction Windev.
C'est performant, interruptible, on peut mettre en pause et reprendre...



vous pouvez mettre un exemple ici ?

--
Cordialement JeAn-PhI
Avatar
patrice
"JeAn-PhI" a écrit dans le message de
news:49b6249e$0$5260$
Gilles a formulé la demande :
> Après mure réflexion, Gilles a écrit :
>> Bonjour,
>>
>> fCopieFichier fonctionne, mais sur de gros fichiers, l'absence de jauge


est
>> problématique.
>
> Pour ceux que ça interesse, j'ai fini par le faire avec l'API et une


callback
> de fonction Windev.
> C'est performant, interruptible, on peut mettre en pause et reprendre...

vous pouvez mettre un exemple ici ?

--



c'est si compliqué que ca d'utiliser fouvre, et un boucle avec flit, fecrit
?
Avatar
Romain PETIT
patrice vient de nous annoncer :
c'est si compliqué que ca d'utiliser fouvre, et un boucle avec flit, fecrit
?



Il n'a pas dit que c'était compliqué, il a dit que c'était beaucoup
moins performant...(cf 1 post).

A+

--
Romain PETIT
contact : http://cerbermail.com/?O16kfXOFcq
+-+ posté sur Usenet avec MesNews et non depuis un forum web +-+
news:fr.comp.developpement.agl.windev
http://www.mesnews.net/
http://fr.wikipedia.org/wiki/Newsgroup
Avatar
patrice
"Romain PETIT" a écrit dans le message de
news:
patrice vient de nous annoncer :
> c'est si compliqué que ca d'utiliser fouvre, et un boucle avec flit,


fecrit
> ?

Il n'a pas dit que c'était compliqué, il a dit que c'était beaucoup
moins performant...(cf 1 post).




mea culpa, pas lu le premier post.
mais meme avec les api, la taille du buffer influe sur le temps.
faut essayer sous windev avec un gros buffer fixe (64ko) et ca devrait le
faire sans (trop) de perte de performance.
Avatar
Gilles
patrice a présenté l'énoncé suivant :
"Romain PETIT" a écrit dans le message de
news:
patrice vient de nous annoncer :
c'est si compliqué que ca d'utiliser fouvre, et un boucle avec flit, fecrit
?



Il n'a pas dit que c'était compliqué, il a dit que c'était beaucoup
moins performant...(cf 1 post).




mea culpa, pas lu le premier post.
mais meme avec les api, la taille du buffer influe sur le temps.
faut essayer sous windev avec un gros buffer fixe (64ko) et ca devrait le
faire sans (trop) de perte de performance.



Déjà essayé, ca reste toujours médiocre par rapport à l'API.
On ne sait pas comment est codé flit/fecrit...
Avatar
patrice
"Gilles" a écrit dans le message de
news:

Déjà essayé, ca reste toujours médiocre par rapport à l'API.
On ne sait pas comment est codé flit/fecrit...




vous utilisez bien la syntaxe avec buffer : fLit(nIdSrc,nLire,&buf) ?
Avatar
Gilles
JeAn-PhI avait écrit le 10/03/2009 :
Gilles a formulé la demande :
Après mure réflexion, Gilles a écrit :
Bonjour,

fCopieFichier fonctionne, mais sur de gros fichiers, l'absence de jauge
est problématique.



Pour ceux que ça interesse, j'ai fini par le faire avec l'API et une
callback de fonction Windev.
C'est performant, interruptible, on peut mettre en pause et reprendre...



vous pouvez mettre un exemple ici ?



voui, il faut deux fonctions, une principale et une callback pour l'API
:

FONCTION fCopieFic(sSource est une chaîne,sDest est une chaîne)

sLocSource est une chaîne=sSource
sLocDest est une chaîne=sDest
bRetourApi est un booléen
nExistingFileName est un entier=&sLocSource //Ici l'adresse de la
chaine, pourrait être la chaine en direct
nNewFileName est un entier=&sLocDest //Ici l'adresse de la chaine,
pourrait être la chaine en direct
nData est un entier
nCancel est un entier
nCopyFlags est un entier

bRetourApi=API("KERNEL32","CopyFileExA",nExistingFileName,nNewFileName,&fCopyProgressRoutine
,nData,nCancel ,nCopyFlags)

RENVOYER bRetourApi


et la callback :

FONCTION fCopyProgressRoutine(nTotalFileSize est un entier sur 8
octets,nTotalBytesTransferred est un entier sur 8 octets,nStreamSize
est un entier sur 8 octets,nStreamBytesTransferred est un entier sur 8
octets,nStreamNumber est un entier sans signe sur 4
octets,nCallbackReason est un entier sans signe sur 4
octets,hSourceFile est un entier,hDestinationFile est un entier)

Jauge(nTotalBytesTransferred,nTotalFileSize)

//Annulation de la copie
//Pour les autres paramètres voir la MSDN
//http://msdn.microsoft.com/en-us/library/aa363854(VS.85).aspx
SI ToucheEnfoncée(teEchap,Faux) ALORS
RENVOYER 1
FIN



Voilà, enjoy ;)
Avatar
Gilles
patrice a émis l'idée suivante :
"Gilles" a écrit dans le message de
news:

Déjà essayé, ca reste toujours médiocre par rapport à l'API.
On ne sait pas comment est codé flit/fecrit...




vous utilisez bien la syntaxe avec buffer : fLit(nIdSrc,nLire,&buf) ?



Ben vui ;)
Mais rien que sur un simple test de boucle (du moins en V11, je ne sais
pas si leur nouveau moteur JIT est plus performant), Windev se fait
exploser par la même chose en C, ou même en C#...

Donc je ne suis pas vraiment surpris des résultats, les I/O dans Windev
n'ont jamais été délirants sur tous les traitements de fichiers que
j'ai eu à faire jusqu'ici, ça marche mais il ne faut pas chercher les
grandes performances.

Comme mon projet consiste à copier/déplacer des centaines de mo voire
des go, le passage via l'API fait toute la différence.

Et quand on copie un fichier qui fait 300mo, la jauge est primordiale.

Il faut encore que je puisse mette ça dans un thread différent du
principal, sinon ca gèle l'appli pendant la copie, ça ne devrait pas
être trop difficile.

Gilles.
Avatar
JeAn-PhI
Gilles avait prétendu :
JeAn-PhI avait écrit le 10/03/2009 :
Gilles a formulé la demande :
Après mure réflexion, Gilles a écrit :
Bonjour,

fCopieFichier fonctionne, mais sur de gros fichiers, l'absence de jauge
est problématique.



Pour ceux que ça interesse, j'ai fini par le faire avec l'API et une
callback de fonction Windev.
C'est performant, interruptible, on peut mettre en pause et reprendre...



vous pouvez mettre un exemple ici ?



voui, il faut deux fonctions, une principale et une callback pour l'API :

FONCTION fCopieFic(sSource est une chaîne,sDest est une chaîne)

sLocSource est une chaîne=sSource
sLocDest est une chaîne=sDest
bRetourApi est un booléen
nExistingFileName est un entier=&sLocSource //Ici l'adresse de la chaine,
pourrait être la chaine en direct
nNewFileName est un entier=&sLocDest //Ici l'adresse de la chaine, pourrait
être la chaine en direct
nData est un entier
nCancel est un entier
nCopyFlags est un entier

bRetourApi=API("KERNEL32","CopyFileExA",nExistingFileName,nNewFileName,&fCopyProgressRoutine
,nData,nCancel ,nCopyFlags)

RENVOYER bRetourApi


et la callback :

FONCTION fCopyProgressRoutine(nTotalFileSize est un entier sur 8
octets,nTotalBytesTransferred est un entier sur 8 octets,nStreamSize est un
entier sur 8 octets,nStreamBytesTransferred est un entier sur 8
octets,nStreamNumber est un entier sans signe sur 4 octets,nCallbackReason
est un entier sans signe sur 4 octets,hSourceFile est un
entier,hDestinationFile est un entier)

Jauge(nTotalBytesTransferred,nTotalFileSize)

//Annulation de la copie
//Pour les autres paramètres voir la MSDN
//http://msdn.microsoft.com/en-us/library/aa363854(VS.85).aspx
SI ToucheEnfoncée(teEchap,Faux) ALORS
RENVOYER 1
FIN



Voilà, enjoy ;)



merci

--
Cordialement JeAn-PhI