Utilisation des fichiers
En Tcl, et particulièrement lorsqu'on travaille avec un eggdrop, l'utilisation des fichiers pour le stockage de données est très fréquent.
Voici donc quelques exemples appliqués de la manipulation de fichiers.
Contents
Ouverture
Un fichier s'ouvre avec la commande open, qui est de la forme:
open /chemin/du/fichier mode
- /chemin/du/fichier est le chemin soit complet (depuis la racine du serveur) soit relatif (depuis la position de l'eggdrop)
- mode est le type d'ouverture: r pour lecture, w pour écriture (au début du fichier) et a pour append (ajouter des lignes à la fin du fichier).
La commande open crée une resource qui est ensuite utilisée pour toute opération sur le fichier.
Les modes d'ouverture sont volontairement simplifiés, voir la page open pour plus d'informations
Lecture
Lecture complète d'un fichier
La lecture s'effectue avec la commande read. Voici comment lire tout un fichier et renvoyer les lignes en party_line
set fi [open "monfichier.txt" r]
set line [read -nonewline $fi]
foreach line [split $line "\n"] {
putlog $line
}
close $fi
Lecture ligne par ligne
Il n'est pas possible de lire une ligne en particulier dans un fichier, la commande seek permettant seulement d'avancer d'un certain nombre d'octets. Mais il est possible de lire un fichier ligne par ligne avec gets, ce qui est utile pour les gros fichiers. Avec un compteur, on peut de plus n'extraire que la ligne désirée.
proc getLine { fichier num } {
set fi [open "monfichier.txt" r]
set cpt 0
while {[eof $fi] != 1 } {
incr cpt
set line [gets $fi]
if { $cpt == $num } {
putlog $line
}
}
close $fi
}
Notez l'utilisation de eof qui signifie end of file ("fin de fichier") pour contrôler la boucle while.
Ce code n'est bien sûr pas optimisé car tout le fichier est lu même si la ligne désirée est atteinte.
Ecriture
Il existe deux modes d'écriture:
- write écrase le fichier existant (ou le crée)
- append ajoute du contenu à la fin du fichier (ou le crée)
Ecriture complète
Pour (ré)écrire complètement un fichier, il suffit de l'ouvrir en mode w et d'insérer le contenu avec puts:
set fi [open "monfichier" w]
puts $fi "une ligne"
puts $fi "Une seconde ligne"
close $fi
Avec ce code, votre fichier sera chaque fois écrasé et contiendra les deux lignes.
Ajouter une ligne
Ajouter une ligne à la fin d'un fichier est tout aussi simple:
set fi [open "monfichier.txt" a]
puts $fi "Une troisième ligne"
close $fi
Si monfichier.txt existait, et est celui précédement utilisé, il contiendra une troisième ligne.
Suppression d'une ligne
Le moyen le plus basique (mais peu optimisé) pour supprimer une ligne est de lire le fichier et de stocker toutes les lignes sauf celle à supprimer, puis de ré-écrire le fichier.
Voici un exemple où nous allons supprimer toutes les lignes commençant par "bla" dans un fichier
set tmp "monfichier.tmp"
set fi [open "monfichier.txt" r]
set fo [open $tmp w]
while { [eof $fi] != 1 } {
set ligne [gets $fi]
if { [string first "bla" $ligne] != 0 } {
puts $fo $ligne
}
}
close $fi
close $fo
file rename -force $tmp "monfichier.txt"