Lenteur de la fonction CopyFile() !!!

Lenteur de la fonction CopyFile() !!! - Delphi/Pascal - Programmation

Marsh Posté le 12-06-2003 à 09:11:44    

Slt !
 
J'ai fait une petite appli et j'essaie maintenant de l'optimiser..
Je me suis rendu compte que parfois, la fonction CopyFile() peut être très rapide sur un fichier de plusieurs Méga, et d'autres fois pour le même fichier, au même moment du programme, il va mettre au moins 5 s de plus !!!
Comme je l'utilise plusieurs fois dans mon appli, c'est assez ennuyant car parfois je peux avoir un écart de 15 à 20 s pour le même résultat !!!
J'essaie de faire le plus rapide et fiable possible.
 
Pouvez-vous me conseiller ?
Merci.

Reply

Marsh Posté le 12-06-2003 à 09:11:44   

Reply

Marsh Posté le 12-06-2003 à 10:07:03    

C'est une fonction de l'API Windows [:spamafote]
 
Je crois qu'une bonne méthode est d'utiliser les TFileStream:
mettre le second stream à la taille du premier (Dest.Size := Source.Size), puis faire un Dest.CopyFrom(Source) ou un truc du genre.
 
Sinon t'as SHFileOperation qui est ce qu'utilise l'explorateur Windows, donc tu peux même avoir la fenêtre qui affiche la progression.


Message édité par antp le 12-06-2003 à 10:07:45

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 12-06-2003 à 10:44:05    

Bon, après pas mal d'essais pour évaluer les résultats, voici ce que j'ai obtenu (pour 6 Mo):
 
* CopyFile
--> 50% des essais en 1s
--> 50% des essais en 20s !!!
 
* TFileStream
--> 100% des essais en 10s
 
Comme quoi il y a pas mal de différences..
Sinon, pour l'instant j'effectue mes tests sur un serveur Windows
mais mon appli sera ensuite utilisée notamment pour copier des fichiers d'un serveur UNIX vers un serveur Windows.
Donc y a-t-il une méthode à privilégier pour la copie à partir d'un serveur UNIX vers un serveur Windows ??
 
Merci.

Reply

Marsh Posté le 12-06-2003 à 10:54:27    

comment tu procèdes pour tes essais? par ce que si tu as un disque lent, tu lance un fois ok, quand tu relances juste derriere, l'OS est encore entrain de fflusher, donc les novuelles opérations sont ralenties

Reply

Marsh Posté le 12-06-2003 à 11:37:09    

Ben en fait j'ai testé env. 7 fois avec TfileStream,
où j'ai tjs obtenu le même résultat.
 
Ensuite j'ai testé avec le CopyFile où j'ai obtenu
1 une 1s, une fois 20s, une fois 1s, une fois 20s
et ainsi de suite.
 
Puis j'ai retesté TFileStream (tjs pareil)
et CopyFile (tjs pareil aussi).

Reply

Marsh Posté le 12-06-2003 à 11:40:07    

fais les tests avec quelques secondes de pause entre les exécutions

Reply

Marsh Posté le 12-06-2003 à 14:45:49    

Bon, j'ai refait des essais avec cette fois-ci
un fichier de 10 Mo !!!
 
 
CopyFile
--> 35s  (4x)
 
TFileStream
--> 18s  (3x)
 
 
Et ATTENTION !!!!
 
Block
--> 4s  (1x)
--> 3s  (1x)
--> 2s  (5x)
 
 
Oui, c'est ultra rapide avec cette méthode par blocks !!
J'avais découvert cette méthode en me formant à Delphi
et j'avais déjà trouvé que c'était une méthode RAPIDE !!!
 
 
Alors ?

Reply

Marsh Posté le 12-06-2003 à 14:56:49    

c'est quoi block ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 12-06-2003 à 15:08:27    

il parle surement de BlockRead et BlockWrite

Reply

Marsh Posté le 12-06-2003 à 15:17:18    

Oui, tout à fait, c'est bien cela !!!
 
Désolé de ne pas avoir expliqué.
C'est extrêmement rapide !

Reply

Marsh Posté le 12-06-2003 à 15:17:18   

Reply

Marsh Posté le 12-06-2003 à 15:26:44    

c'est bon à savoir, faudra que je fasse des tests


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 12-06-2003 à 15:50:15    

Pour une fois que je t'apprends qqchose antp !!   :D  
Mais bon, je ne m'avance pas trop !!   :ange:  
 :sol:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed