Table des matières

fcopy

Copie des données d'un canal à un autre.

Syntaxe

fcopy inchan outchan ?-size size? ?-command callback?

Description

La commande fcopy copie données d'un canal I/O, inchan à un autre canal I/O, outchan. La commande fcopy force la mise en tampon dans le système I/O Tcl pour éviter une copie supplémentaire et pour éviter la mise en tampon de trop de données en mémoire pendant la copie de gros fichiers vers des destinations lentes comme les sockets réseau.

La commande fcopy transfère les données de inchan jusqu’à la fin du fichier ou bien que size octets aient été transférés. Si aucun argument -size n'est donné, alors la copie va jusqu’à la fin du fichier. Toute les données lues à partir de inchan sont copiées vers outchan. Sans l'option -command, fcopy bloque jusqu’à ce que la copie soit complète et retourne le nombre d'octets écrits dans outchan.

L'argument -command fait travailler fcopy en arrière-plan. Dans ce cas elle retourne immédiatement et le callback est appelé plus tard quand la copie se termine. Le callback est appelé avec un ou deux arguments supplémentaire qui indique combien d'octets ont été écrits dans outchan. Si une erreur s'est produite pendant la copie en arrière-plan, le second argument est la chaîne associée à l'erreur. Avec une copie en arrière-plan, it n'est pas nécessaire de mettre inchan ou outchan dans un mode non-bloquant; la commande fcopy en prend soin de automatiquement. Néanmoins, il est nécessaire d'entrer dans la boucle d’événement en utilisant la commande vwait ou en utilisant Tk.

Vous n’êtes pas autorisés à faire d'autre opérations I/O avec inchan ou outchan pendant une fcopy en arrière-plan. Si soit inchan soit outchan est fermé pendant la copie est en cours, la copie courante est stoppée et le callback n'est pas fait. Si inchan est fermé, alors toutes les données déjà en file pour outchan sont écrites.

Notez que inchan peut devenir lisible pendant une copie en arrière-plan. Vous devez arrêter quelconque gestionnaires fileevent pendant une copie en arrière-plan ainsi ces gestionnaires n' interféreront pas avec la copie. N'importe quel I/O tenté par un gestionnaire fileevent aura une erreur “ canal busy”.

Fcopy traduit les séquences de fin de ligne de inchan et outchan en accord avec l'option -translation pour ces canaux. Voir la page de manuel de fconfigure pour des détails sur l'option -translation. Les traductions signifient que le nombre d'octets lus de inchan peut être différent du nombre d'octets écrits à outchan. Seul le nombre d'octets écrits sur outchan est rapporté, soit comme la valeur de retour d'un fcopy synchrone ou comme l'argument du callback pour un fcopy asynchrone.

Exemples

Ce premier exemple montre comment le callback récupère le nombre d'octets transféré. Il aussi utilise vwait pour placer l'application dans la boucle d’événement. Bien sur, cet exemple simplifié pourrait être fait sans la commande callback.

proc Cleanup {in out bytes {error {}}} {
   global total
   set total $bytes
   close $in
   close $out
   if {[[string length $error]] != 0} {
      # l'erreur s'est produite pendant la copie
   }
}
set in [[open $file1]]
set out [[socket $serveur $port]]
fcopy $in $out -command [[liste Cleanup $in $out]]
vwait total

Le second exemple copie par tranches et teste la fin de fichier dans la commande callback

proc CopyMore {in out chunk bytes {error {}}} {
   global total done
   incr total $ bytes
   if {([[string length $error]] != 0) || [[eof $in]] {
      set done $total
      close $in
      close $out
   } else {
      fcopy $in $out -command [[list CopyMore $in $out $chunk]] \
        -size $chunk
   }
}
set in [[open $file1]]
set out [[socket $serveur $port]]
set chunk 1024
set total 0
fcopy $in $out -command [[list CopyMore $in $out $chunk]] -size $chunk
vwait done

Voir aussi

eof, fblocked, fconfigure