dise il y a un fichier Je veux suivre ce fichier dans l'environnement TCL. P> J'ai essayé ceci mais cela n'a pas fonctionné. P> log.txt code> et une sorte de journal est annexé de manière permanente.
set log [open log.txt a]
for { } { true } { update; after 1000 } {
# expected to get here the appended part
read $log
seek $log 0 end
}
3 Réponses :
Il suffit d'utiliser Dans l'un de mes projets, j'ai quelque chose comme ça pour surveiller un fichier de trace produit par un outil propriétaire: P> < pré> xxx pré> L'idée générale est que vous reprochez code> queue code> sur un fichier donné puis entrez la boucle d'événement et le processus queue code>. Il en sait plus que vous sur la manière de gérer les cas complexes (vous pouvez regarder sa source).
la ligne de sortie code> ligne. p> p>
Tout en exploitant d'autres outils est généralement un excellent moyen de faire des choses, votre solution prend plus de code et nécessite un programme externe que de simplement mettre en œuvre une solution pure TCL.
@ Bryan Oakley, je vous invite honnêtement à regarder dans les sources de la queue GNU pour savoir que la tâche de regarder un fichier étant ajoutée de manière externe n'est pas aussi facile que celle qui semble être sur le premier coup d'œil. Bien sûr, il peut être fait à l'aide de TCL (à condition que vous tiriez d'abord un appel FCNTL () pertinent dans le niveau de script), mais pourquoi?
Même si vous avez besoin de la fonctionnalité -Seillle = nom de nom, ce n'est pas trop difficile à faire dans TCL - par exemple. Voir mon Flog .
Vous n'êtes pas loin, juste quelques choses à réparer:
Vous n'avez besoin que de la commande de mise à jour si votre traitement de la boucle consiste à mettre à jour une interface graphique ou autre chose qui nécessite la boucle d'événement - ce n'est pas nécessaire pour le code posté. Tout à fait cela donne: p>
set log [open log.txt] seek $log 0 end for { } { true } { after 1000 } { # expected to get here the appended part puts -nonewline [read $log] }
J'ai réussi à écrire queue -f code> équivalent sur pure tcl. Le code est ci-dessous:
proc readHandler {handle} {
puts -nonewline [read $handle]
flush stdout
# to reduce CPU overhead...
after 1000
}
set hFile [open "file.log" "r"]
# seek to the end of file if needed
# seek $hFile 0 end
fconfigure $hFile -buffering none -eofchar "" -blocking no
fileevent $hFile readable [subst {readHandler $hFile}]
#just for exiting into main event loop
vwait forever
Je pense que vous constaterez que le fichier semble toujours lisible lorsque vous êtes à sa fin, le gestionnaire incendie continuellement et mâche tout votre CPU inutilement.
D'accord. Ensuite, vous pouvez toujours insérer la commande de sommeil (c'est-à-dire après 1000 code>) dans le gestionnaire pour réduire les frais généraux de la CPU.
Peut-être que cela peut aider -
http://code.activestate.com/recipes/65437-tail-a-file/ code>