Les manipulations de fichiers avec PHP
Fonctions de tests
Avant de faire quoique ce soit sur un fichier il faut souvent effectuer des tests pour connaître l'état de celui-ci (existe t'il, est t'il lisible ...).Voici quelques fonctions qui vous simplifieront la vie.
- file_exists
Cette fonction permet de déterminer si un fichier existe et est accessible.
Le fichier sous unix par exemple peut exister mais ne pas être accessible par l'utilisateur qui est propriétaire du démon httpd.
Elle renvoie la valeur true si le fichier est présent.$fichier="donnees.dat";
if(file_exists($fichier)) {
print " Le fichier $fichier existe";
}
else
print "Le fichier $fichier n'existe pas sur la machine $SERVER_NAME"; - is_file et is_dir
Vous permet de définir si l'élément sur lequel on travaille est un fichier.
La fonction is_dir permet de tester si c'est un répertoire.
Ces fonctions renvoient true si c'est un fichier ou si c'est un répertoire.if(is_file("fichier.data"))
print "l'élément est un fichier";
else
print "L'élément n'est pas un fichier"; - is_readable, is_writable et is_executable
Cette fonction permet de tester les droits sur le fichier indiqué en paramètre.
Attention les droits sont ceux concernant l'utilisateur propriétaire du démon httpd.
is_readable permet de déterminer si le fichier possède les droits de lecture.
is_writable permet de déterminer si le fichier possède les droits d'écriture.
is_executable permet de déterminer si le fichier possède les droits d'exécution.exemple
<HTML><BODY BGCOLOR=#FFFFFF>
<B><U>Test sur les fichiers</U><Br><Br>
<?
#La variable $SCRIPT_FILENAME renvoie le nom du programme en cours
$variable = $SCRIPT_FILENAME;
if(is_file($variable))
{
print "<BR>Etat du fichier testé<BR>";
# Je lance une commande système qui récupère l'état du fichier
system("ls -l $SCRIPT_FILENAME|awk '{print $1\" \"$5\" \"$9}'");
print "<BR><BR>Test sur le fichier avec les fonctions<BR>";
print "<FONT COLOR=green>$variable</FONT> ";
print " est un fichier<BR> ";
if(is_readable($variable))
{print "<FONT COLOR=green>lisible</FONT> ";}
if(is_writable($variable))
{print "<FONT COLOR=green>modifiable</FONT> ";}
if(is_executable($variable))<br> {print "<FONT COLOR=green>exécutable</FONT> ";}
}
else
{
print "<FONT COLOR=green>$variable</FONT> ";
print " n'est pas un fichier ou n'est pas accessible";
}
?>
</FONT></BODY></HTML> - filesize
Vous obtenez avec cette fonction la taille en octets du fichier.$taille=filesize($fichier);
- fileatime, filemtime et filectime
Ces fonctions permettent respectivement de déterminer depuis quand le fichier a été accédé, depuis quand le fichier a été modifié et depuis quand le fichier a vu ses attributs modifiés (droits ...).
La valeur renvoyée correspond au nombre de secondes écoulées depuis le 1er janvier 1970 (c'est le format epoch UNIX).
Il est donc nécessaire d'utiliser ensuite la fonction date pour la remise en forme de cette valeur.$duree=fileatime($fichier);
$duree=filemtime($fichier);
$duree=filectime($fichier); - touch
Pour les amateurs d'unix, cette commande n'est pas inconnue. Elle permet de modifier les attributs de temps sur un fichier en positionnant la date, l'heure ... au moment ou la commande est lancée.
Si le fichier n'existe pas il permet de le créer à vide.touch($fichier);
- unlink
Cette fonction permet de détruire un fichier.
Vous pouvez aussi utiliser la fonction system qui permet de lancer n'importe quelle commande(system("/bin/rm $fichier"))
syntaxe de la fonction:unlink($fichier);
- copy
Cette fonction vous permet d'effectuer une copie d'un fichier d'un endroit à un autre.copy($source_fichier,$destination_fichier);
Ouverture et fermeture des fichiers
- fopen
Nous commencerons par la principale, celle qui permet d'ouvrir un descripteur de fichier pointant sur le premier élément du fichier sur lequel nous voulons travailler.
fopen renvoie la valeur false si l'ouverture n'a pu avoir lieu, sinon elle renvoie le pointeur (descripteur) référençant le fichier ouvert.
Les fichiers peuvent être ouverts en lecture, ajout ou écriture. Pour cela il suffit de positionner le bon attribut. Les attributs sont respectivement r,a et w.
Vous pouvez ouvrir un fichier local mais aussi n'importe quel fichier accessible sur le web (via http ou ftp) pour récupérer son contenu (aspirateur de site).$pointeur=fopen($fichier,'attribut');
ou avec un testif($pointeur=fopen($fichier,'attribut'))
{print "Fichier ouvert correctement";}
else
{print "Problème lors de l'ouverture du fichier";}exemple
<HTML> <BODY bgcolor=#FFFFFF>
<B> <U>Travail sur les fichiers</U> <Br>
<br>
<?
$fichier="is_file.php";
if($pointeur=fopen($fichier,'r'))
{
print "Le fichier <font color=green>$fichier</font> existe<br>";
print "Voici son contenu interprété<br>";
while(!feof($pointeur))
{
#Je lis le contenu HTML du fichier
$ligne=fgets($pointeur,512);
#Je transforme les < et les> pour éviter leurs interprétation #en HTML sinon nous ne voyons pas le code
$lignemodif1=str_replace("<","<",$ligne);
$lignemodif2=str_replace("<","<",$lignemodif1);
print "<font color=red>$lignemodif2</font><br>";
}
fclose($pointeur);
}
else
{print "Probleme d'ouverture du fichier <font color=red>$fichier</font>";}
?>
</font> </BODY> </HTML> - fclose
Lorsque vous ouvrez un fichier, une fois son utilisation terminée il faut libérer le pointeur afin de libérer le fichier.fclose($pointeur);
Lecture des données
- fgets
Une fois le fichier ouvert, le but généralement n'est pas d'en rester là, mais de charger le contenu ou d'écrire à l'intérieur. Cette fonction nécessite deux éléments pour pouvoir fonctionner : le pointeur récupéré au moment de l'ouverture du fichier et la taille des blocs de données, en octets, à lire.
Si la taille des éléments à lire sur une ligne est inférieure à la limite donnée, le retour chariot (/n) signale la fin du bloc.$ligne=fgets($pointeur,$taille);
- fread
Cette fonction fonctionne comme fgets à la différence près qu'elle lira toujours des blocs de x octets quelque soit la place du retour chariot.
Cette fonction a aussi besoin du pointeur et de la taille en argument.$bloc=fread($pointeur,$taille_bloc);
- fgetc
Cette fonction de lecture permet de lire octet par octet le fichier. Elle a besoin du descripteur de fichier en argument (pointeur).$car=fgetc($pointeur);
Ecriture des données
Vous savez comment lire les éléments contenus dans un fichier mais il peut être très intéressant de pouvoir stocker dans des fichiers des informations provenant de formulaires. Pour pouvoir écrire dans un fichier il faut auparavant l'avoir ouvert en écriture ou ajout (voir la partie fopen).fputs et fwrite
Ces deux fonctions fonctionnent de la même manière et renvoient true si l'écriture s'est correctement effectuée. Elles nécessitent comme argument le pointeur de fichier et la chaîne à écrire.
fputs($pointeur,$chaine);
fwrite($pointeur,$chaine);
exemple
<HTML> <BODY bgcolor=#FFFFFF>
<B> <U>Travail sur les fichiers</U> <Br>
<br>
<?
$fichier="/tmp/ecrire.txt";
print "1. Je détruis le fichier <font color=green>$fichier</font><Br>";
unlink($fichier);
print "2. J'ouvre le fichier en ecriture<Br>";
if($pointeur=fopen($fichier,'w'))
{
print "3. J'ecris les informations<BR>";
fwrite($pointeur,"login:password\n");
fwrite($pointeur,"jacquenod:nantes44\n");
fputs($pointeur,"alexandre:paris75\n");
}
fclose($pointeur);
print "4. Je lis le contenu du fichier<BR>";
if($pointeur=fopen($fichier,'r'))
{
print "Le fichier <font color=green>$fichier</font> existe<br>";
print "<HR>Voici son contenu<BR>";
$i=0;
while($ligne=fgets($pointeur,512))
{
$i++;
print "ligne$i : <font color=red>$ligne</font><BR> ";
}
fclose($pointeur);
}
else
{print "Probleme d'ouverture du fichier <font color=green>$fichier</font>";}
?>
</font> </BODY> </HTML>
Autres fonctions utiles
- feof
Cette fonction permet de tester la fin du fichier que vous lisez. Si elle est atteinte, la fonction renvoie la valeur VRAIE. Elle a besoin du descripteur de fichier en argument (pointeur).
Vous retrouverez eof notamment dans les boucles de lecture du contenu d'un fichier.feof($pointeur);
- fseek
Cette fonction permet de se positionner dans un fichier. Vous devez indiquer le nombre d'octets que vous parcourez avant de vous positionner.
Vous devez comme toujours indiquer le pointeur de fichier.fseek($pointeur,nboctets);
- flock
Cette fonction permet de verrouiller un fichier lors de son utilisation par plusieurs programmes. Attention ce verrou n'est valide qu'en PHP4 et seulement dans les programmes php l'utilisant. Si vous combinez un programme php utilisant flock avec un programme perl rien ne sera verrouillé.
Vous avez plusieurs niveaux de verrouillage, la lecture simple (1), la lecture et l'écriture interdites (2) et le déverrouillage (3). Pour cela un argument numérique est utilisé en plus du pointeur sur le fichier.
Lors du verrouillage seul le programme qui a réalisé le verrouillage peut travailler sur le fichier.flock(pointeur,chiffre);
Importation de fichiers php
Comme dans tous les langages ou presque vous pouvez réutiliser des éléments déjà crées dans un autre programme php sans être obligé de tout réécrire.Pour cela vous devez utiliser le mot clé include qui demande comme argument le chemin et le nom du fichier dont les instructions sont à inclure.
Ce fichier peut contenir du code HTML brut et ce dernier sera interprété tel quel.
Mais vous pouvez inclure un fichier contenant aussi du code PHP pour cela il vous suffit dans ce fichier de créer des instruction PHP incluse entre les bornes du langage PHP (<? ?>).
include(fichier);