Intercepter la jauge de copie de fichiers

Le
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)
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles
Le #18864681
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...
JeAn-PhI
Le #18866171
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
patrice
Le #18866311
"JeAn-PhI" 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
?
Romain PETIT
Le #18866431
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
patrice
Le #18866551
"Romain PETIT" 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.
Gilles
Le #18867091
patrice a présenté l'énoncé suivant :
"Romain PETIT" 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...
patrice
Le #18867271
"Gilles" 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) ?
Gilles
Le #18867261
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 ;)
Gilles
Le #18867251
patrice a émis l'idée suivante :
"Gilles" 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.
JeAn-PhI
Le #18867941
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
Publicité
Poster une réponse
Anonyme