Developpez.com - Autres
X

Choisissez d'abord la catégorieensuite la rubrique :

Sommaire > Perl avancé > Les fichiers
        Notion de handle de fichier
        Ouvrir et fermer un fichier
        Vivre et laisser mourir
        Tests sur les fichiers
        Se déplacer dans l'arborescence
        Handle de répertoire
        Suppression de fichiers
        Renommer des fichiers
        Création/Suppression de répertoires
        Des commandes Unix dans Perl pour les fichiers

        


Notion de handle de fichier
auteur : GLDavid
Dans les précédentes parties, vous avez conçu vos programmes Perl pour que ceci puissent converser via les entrées/sorties (E/S) standards à savoir : STDIN (le clavier), STDOUT (l'écran) et STDERR (sortie standard en cas d'erreur). Dans ce chapitre, nous allons maintenant apprendre à lire à partir des fichiers stockés sur un média (disque dur, CDROM, disquette,...). Le langage Perl nécéssite pour la lecture/écriture de fichiers de handles. Un handle n'est qu'une connexion entre votre programme Perl et le fichier à lire ou à écrire. Il existe déjà 6 handles de fichiers réservés : STDIN (soit le flux d'entrée standard), STDOUT (flux de sortie standard), STDERR (direction des erreurs), DATA, ARGV et ARGVOUT.


Ouvrir et fermer un fichier
auteur : GLDavid
Rien ne vous empêche dans Perl de créer et nommer vos propres handles. De même, les connaisseurs d'unix seront sans doute ravis de savoir que les redirections d'entrées/sorties standards sont primordiales pour indiquer au handle la direction du flux. Voici d'ailleurs un exemple pour illustrer l'ouverture d'un fichier en Perl. Nous supposerons qu'il existe dans le même répertoire que notre script un fichier « toto.txt » :

open TOTO, "< toto.txt ";
Dans cet exemple, le chevron "<" indique que nous sommes en lecture. Bien naturellement, il est envisageable de mettre dans une variable scalaire le chemin de votre fichier :

$chemin = "/home/gldavid/toto.txt"; open TOTO, "< $chemin";
L'écriture reprend la même syntaxe, sauf que vous aurez 2 méthodes :

open TOTO, "<< toto.txt"; open TATA, "< tata.txt";
Quelle est la différence entre ces 2 instructions ? Les amateurs d'Unix vous diront que dans le premier cas, nous écrivons sur toto.txt mais, si celui-ci n'existe pas, Perl le crée et on écrit dans ce fichier. Dans le cas où celui-ci existe, l'écriture sera effectué depuis la fin de ce fichier. Dans le deuxième cas, si le fichier tata.txt n'existe pas, Perl crée ce fichier puis procède à l'écriture. Dans le cas où le fichier existait au préalable, le contenu sera écrasé par le traitement que vous effectuerez sous Perl. Enfin, il s'agit de procéder proprement. Comme dans tous les langages, dès que vous ouvrez un flux, pensez à le fermer !

open TOTO, "> toto.txt"; #Je lis le fichier toto.txt et j'exécute mon traitement close TOTO;
L'instruction close sur un handle permet de fermer toute lien entre votre processus Perl et le fichier visé.


Vivre et laisser mourir
auteur : GLDavid
Naturellement, il se peut que vous vous trompiez dans le chemin de votre fichier. Pour le cas où vous souhaitez gérer de telles exceptions, Perl vous offre le choix de tuer votre application et de pouvoir disposer d'un message d'erreur. La close die produit un tel message :

open FILE, "< toto.txt" or die "toto.txt n'existe pas !\n"; while ($ligne = <FILE>) { print « $ligne\n »; }
Lorsque votre script Perl arrive à cette instruction et si celui-ci ne trouve pas le fichier toto.txt, la close die entre en jeu. Votre programme s'arrêtera en vous affichant le message « toto.txt n'existe pas ! ». Vous pourrez bien sûr utiliser aussi la variable $! qui marque l'erreur émanant du système. Dans le cas ou tout se passe bien à l'ouverture du handle, le programme affichera sur la sortie standard le contenu du fichier toto.txt. Mais, vous pouvez aussi faire en sorte d'afficher votre message d'erreur sans pourautant arrêter votre programme Perl. En utilisant la close warn, vous produirez le message d'erreur de votre choix sans que le script s'arrête :

open FILE, "< toto.txt" or warn "toto.txt n'existe pas !\n";

Tests sur les fichiers
auteur : GLDavid
Perl vous autorise à avoir accès au moindre renseignement de vos fichiers. Le tableau suivant résume les différents tests possibles en Perl sur les fichiers (et répertoires) :

-r Le fichier (ou le répertoire) est lisible
-w Le fichier (ou le répertoire) peut être écrit
-x Le fichier (ou le répertoire) est exécutable
-o Le fichier (ou le répertoire) est possédé par cet utilisateur
-R Le fichier (ou le répertoire) est lisible par cet utilisateur ou groupe réel
-W Le fichier (ou le répertoire) peut être écrit par cet utilisateur ou groupe réel
-X Le fichier (ou le répertoire) est exécutable par cet utilisateur ou groupe réel
-O Le nom du fichier ou du répertoire existe
-e Le fichier ou le répertoire existe
-z Le fichier ou le répertoire existe et a une taille de 0 (toujours faux pour les répertoires)
-s Le fichier ou le répertoire existe et a une taille différente de 0
-f L'entrée est un fichier
-d L'entrée est un répertoire
-l L'entrée est un lien symbolique
-S L'entrée est une socket
-p L'entrée est un tube nommée
-b L'entrée est un fichier spécial bloc (comme un périphérique montable)
-c L'entrée est un fichier spécial caractères (périphérique E/S)
-u Le fichier ou le répertoire est setuid
-g Le fichier ou le répertoire est setgid
-k Le bit sticky du fichier ou du répertoire est positionné
-t Le handle de fichier est un TTY
-T Le fichier est un fichier texte
-B Le fichier est un fichier binaire
-M Date de la dernière modification en jour
-A Date du dernier accès en jour
-C Date de la dernière modification d'inode en jour
Apprenez-le par coeur ! Interro surprise la semaine prochaine ;-) A l'aide de ces tests, on peut, par exemple, tester l'existence d'un fichier avant de l'ouvrir :

$file = "/home/gldavid/toto.txt"; if (-e $file) { OPEN FILE, "< $file" or die "Un problème est survenu pendant l'ouverture du fichier !\n"; }
Ou bien, supprimer un fichier si celui-ci a une date de modification supérieure à 15 jours :

$file = « /home/gldavid/toto.txt »; OPEN FILE, "< $file" or die "Un problème est survenu pendant l'ouverture du fichier !\n"; if (-M FILE > 15) { close FILE; unlink $file; print « $file supprimé\n »; }
Toutefois, les informations sur les fichiers peuvent être aussi accessibles à l'aide des fonctions stat et lstat. Pour simplifier, stat ne concerne que les fichiers, lstat vous renseignera plus en détail pour des liens symboliques. La fonction stat vous renvoie au total 13 informations que l'on peut rassembler soit à l'aide de 13 variables scalaires ou d'un tableau :

$chemin = "/home/gldavid/toto.txt"; $dev, $ino, $mode, $nlink, $uid, $gid, $sticky, $rdev, $size, $atime, $mtime, $ctime, $blksize, $block = stat($chemin); #L'équivalent serait : #@infos = stat($chemin);
Ainsi, ces informations sont :

$dev ou $infos[0] Le numéro de périphérique
$ino ou $infos[1] Numéro d'inode du fichier
$mode ou $infos[2] Ensemble des bits de permission du fichier (ex : 0755)
$nlink ou $infos[3] Nombre de liens durs du fichier
$uid ou $infos[4] Identification numérique de l'utilisateur propriétaire du fichier
$gid ou $infos[5] Identification numérique du groupe propriétaire du fichier
$sticky ou $infos[6] Bit sticky du fichier
$size ou $infos[7] Taille en octet du fichier
$atime ou $infos[8] Date (en jours) depuis le dernier accès au fichier
$mtime ou $infos[9] Date (en jours) depuis la dernière modification du fichier
$ctime ou $infos[10] Date (en jours) depuis la dernière modification de l'inode du fichier
$blksize ou $infos[11] Indication pour le système
$block ou $infos[12] Nombre en blocs du fichier
Petit rappel, lstat convient mieux pour les liens symboliques et renverra les mêmes informations que stat. Toutefois, si vous utilisez lstat sur un fichier, lstat renverra dans tous les cas les mêmes informations que stat.


Se déplacer dans l'arborescence
auteur : GLDavid
Se déplacer dans une arborescence de répertoires sous Perl est tout aussi simple que dans un système Unix. Bien entendu, vous pourriez avoir recours à un appel système mais Perl vous fourni la commande vous permettant de vous déplacer ou bon vous semblera :

$chemin = "/home/gldavid/documents"; chdir $path; chdir ("/home/ 2Eurocents/ultra_secrets");

Handle de répertoire
auteur : GLDavid
Ouvrir un répertoire n'est pas plus difficile que d'ouvrir un fichier. Encore une fois, nous aurons recours au handle, ces précieux médias de communication entre votre programme Perl et vos fichiers/répertoires. Mais, tout comme les handles de fichiers, n'oubliez jamais de fermer vos handles de répertoires :

$nbrep = 0; $nbfic = 0; $dossier = "/home/gldavid/perl"; opendir DIR, $dossier or die "$dossier n'existe pas !"; @files = readdir DIR; foreach $fichier (@files) { if (-f $fichier) { $nbfic++; } elsif (-d $fichier) { $nbrep++; } } close DIR; print "Il y a $nbfic fichier(s) et $nbrep répertoire(s) dans $dossier.\n";
Ce programme permet de compter le nombre de fichiers et de répertoires contenus dans le répertoire /home/gldavid/perl. Avec l'instruction opendir, nous ouvrons notre handle DIR sur ce répertoire. Si celui-ci n'existe pas, le programme se termine avec un message d'erreur décrit dans la clause die. Si tout se déroule bien, la fonction readdir va rassembler dans le tableau files tous les fichiers/répertoires contenus dans notre répertoire d'étude. Remarquez que readdir accepte le nom de votre handle. Dans la boucle foreach, nous testons pour chacun des fichiers si celui-ci est un fichier (auquel cas, la variable $nbfic est incrémentée) ou un répertoire (la variable $nbrep est incrémentée). A la fin de cette boucle, Nous affichons le nombre de fichiers et de répertoires contenus dans /home/gldavid/perl.


Suppression de fichiers
auteur : GLDavid
Perl vous donne une fonction qui vous permettra d'effacer un fichier, pourvu que vous en soyez propriétaire :

$fichier = "/home/gldavid/toto.txt"; unlink ($fichier); unlink ("/home/gldavid/secrets_gnux/faq.html");
La fonction unlink vous permet donc d'effacer un fichier. Mais, vous avez aussi la possibilité d'en effacer plusieurs, soit à l'aide de boucles ou bien, si vous fichiers sont de même extension, en utilisant les globales :

chdir ("/home/gldavid/MP3"); unlink glob "*.mp3";
L'utilisation de la claude glob avec le motif « *.mp3 » fera que la fonction unlink effacera tous les fichiers portant l'extension mp3 du répertoire /home/gldavid/MP3.


Renommer des fichiers
auteur : GLDavid
Etes-vous anglophone ? Dans le domaine de l'informatique, cela peut vous être utile. En effet, pour renommer des fichiers, vous aurez recours à la fonction ... rename !

$oldfile = "/home/gldavid/toto.txt"; $newfile = "/home/gldavid/tata.txt"; rename ($oldfile, $newfile); rename ("/home/gldavid/tata.txt", "/home/gldavid/titi.txt");

Création/Suppression de répertoires
auteur : GLDavid
Les unixiens ne sont vraiments pas dépaysés avec Perl ! La création de répertoires nécessite l'appel de la fonction mkdir. Pour supprimer un répertoire, vous aurez naturellement recours à la fonction rmdir si votre répertoire cible est vide de tout fichier :

mkdir ("/home/gldavid/dossier"); rmdir ("/home/gldavid/dossier"); $dossier = "/home/gldavid/perl"; mkdir ($dossier); rmdir ($dossier);

Des commandes Unix dans Perl pour les fichiers
auteur : GLDavid
Au chapitre des commandes Unix se retrouvant dans Perl pour la gestion des fichiers, on retrouve notamment la commande chmod qui permet de modifier les permissions de lecture, écriture, exécution d'un fichier :

chmod 0755, "/home/gldavid/toto.txt";
Dans cet exemple, nous attribuons au fichier /home/david/toto.txt toutes les permissions pour l'utilisateur et les permissions de lecture/exécution pour le groupe et les autres. Attention ! Les permissions symboliques du type r+w ne sont pas permises. Un petit rappel de bon aloi :
  • La lecture a un poids de 4.
  • L'exécution a un poids de 1.
  • L'écriture un poids de 2.
De même, il est possible d'utiliser la fonction chown pour modifier le propriétaire du fichier :

chown "GLDavid", "root", /home/gnux/faq.html;
Cette commande Perl indique que le fichier /home/gnux/faq.html a comme nouveau propriétaire GLDavid du groupe root.


        

Consultez les autres F.A.Q's

Ce document issu de www.developpez.com est soumis à la licence GNU FDL traduit en français ici
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.
Contacter le responsable de la rubrique Autres