6.Le langage PHP
6.11.Fichiers et répertoires
6.11.1.Lire un fichier ligne par ligne
Pour lire un fichier, il faut d'abord l'ouvrir grâce à la fonction fopen(). A l'issue de l'ouverture, on récupère un pointeur (pointant sur le début du fichier) et on lit les lignes grâce à fgets() jusqu'à atteindre la fin du fichier que l'on détecte grâce à feof()
<?php
// Ouverture du fichier en lecture [option 'r']
// et récupération d'un pointeur (ou descripteur de fichier)
// Ici, j'ai utilisé une petite astuce afin d'afficher
// le contenu du fichier constituant ce script
// j'ai donc utilisé __FILE__ au lieu de spécifier
// un fichier par "/chemin/monfichier"
$fd = fopen(__FILE__,'r');
// si fopen retourne faux c'est que le fichier
// ne peut être ouvert en lecture
if (!$fd) {
echo 'Impossible d\'ouvrir le fichier';
} else {
$i = 1; // compteur de ligne
// Lorsque nous atteindrons la fin du fichier
// foef($fd) retournera faux
// et la boucle while s'arrêtera
while (!feof($fd)) {
// Il est temps de lire une ligne du fichier
// et en tout cas au maximum 1024 caractères
$ligne = fgets($fd, 1024);
// Si la fin du fichier n'est pas atteinte
// On peut maintenant afficher la ligne
if (!feof($fd)) echo 'Ligne '.$i.': '.$ligne;
$i++;
}
// On a fini, on ferme !!
fclose($fd);
}
?>
Ligne 1: <?php
Ligne 2: // Ouverture du fichier en lecture [option 'r']
Ligne 3: // et récupération d'un pointeur (ou descripteur de fichier)
Ligne 4: // Ici, j'ai utilisé une petite astuce afin d'afficher
Ligne 5: // le contenu du fichier constituant ce script
Ligne 6: // j'ai donc utilisé __FILE__ au lieu de spécifier
Ligne 7: // un fichier par "/chemin/monfichier"
Ligne 8: $fd = fopen(__FILE__,'r');
Ligne 9:
Ligne 10: // si fopen retourne faux c'est que le fichier
Ligne 11: // ne peut être ouvert en lecture
Ligne 12: if (!$fd) {
Ligne 13: echo 'Impossible d\'ouvrir le fichier';
Ligne 14: } else {
Ligne 15: $i = 1; // compteur de ligne
Ligne 16:
Ligne 17: // Lorsque nous atteindrons la fin du fichier
Ligne 18: // foef($fd) retournera faux
Ligne 19: // et la boucle while s'arrêtera
Ligne 20: while (!feof($fd)) {
Ligne 21:
Ligne 22: // Il est temps de lire une ligne du fichier
Ligne 23: // et en tout cas au maximum 1024 caractères
Ligne 24: $ligne = fgets($fd, 1024);
Ligne 25:
Ligne 26: // Si la fin du fichier n'est pas atteinte
Ligne 27: // On peut maintenant afficher la ligne
Ligne 28: if (!feof($fd)) echo 'Ligne '.$i.': '.$ligne;
Ligne 29: $i++;
Ligne 30: }
Ligne 31:
Ligne 32: // On a fini, on ferme !!
Ligne 33: fclose($fd);
Ligne 34: }
Ligne 35: ?>
Il est également possible de spécifier un nom de fichier par une url ex: "http://www.site.com/chemin/fichier".
6.11.2.Récupérer le contenu d'un fichier dans un tableau
Il existe également une fonction file() permettant de mettre l'ensemble du fichier dans un tableau.
<?php
// Ce script récupère le contenu d'un fichier
// (ici le contenu du script PHP lui même)
$cheminFichierAConsulter = __FILE__; // ou 'chemin/fichier'
$lignesFichier = file($cheminFichierAConsulter);
// affichage du contenu du tableau avec numéro de ligne
foreach ($lignesFichier as $idx => $ligne) {
echo 'Ligne '.($idx+1).': '.$ligne;
}
Ligne 1: <?php
Ligne 2: // Ce script récupère le contenu d'un fichier
Ligne 3: // (ici le contenu du script PHP lui même)
Ligne 4: $cheminFichierAConsulter = __FILE__; // ou 'chemin/fichier'
Ligne 5: $lignesFichier = file($cheminFichierAConsulter);
Ligne 6:
Ligne 7: // affichage du contenu du tableau avec numéro de ligne
Ligne 8: foreach ($lignesFichier as $idx => $ligne) {
Ligne 9: echo 'Ligne '.($idx+1).': '.$ligne;
Ligne 10: }
Si le but est simplement d'afficher le contenu du fichier alors vous pourrez avantageusement opter pour la fonction
readfile(nomdufichier)
6.11.3.Lire un fichier paquet par paquet
La lecture d'un fichier ligne par ligne convient aux fichiers textes (dit fichiers ASCII) par compte cela ne convient pas pour les fichiers binaires (ex: les images). Même si là encore, il convient d'ouvrir le fichier grâce à fopen(), la lecture, elle, se fera par l'intermédiaire de fread(), et à nouveau la fermeture par fclose().
En guise d'exemple, nous n'utiliserons pas de fichier binaire (qu'il serait difficile de représenter) mais un fichier texte (le script lui-même) ce qui est suffisant pour constater que les fins de ligne ne sont pas prisent en compte par la fonction fread().
<?php
// Ouverture du fichier en lecture [option 'r']
// et récupération d'un pointeur (ou descripteur de fichier)
// Ici, j'ai utilisé une petite astuce afin d'afficher
// le contenu du fichier constituant ce script
// j'ai donc utilisé __FILE__ au lieu de spécifier
// un fichier par "/chemin/monfichier"
$fd = fopen(__FILE__,'r');
// si fopen retourne faux c'est que le fichier
// ne peut être ouvert en lecture
if (!$fd) {
echo 'Impossible d\'ouvrir le fichier';
} else {
$i = 1; // compteur de paquets
// Lorsque nous atteindrons la fin du fichier
// foef($fd) retournera faux
// et la boucle while s'arrêtera
while (!feof($fd)) {
// Il est temps de 80 caractères (si possible)
$paquet = fread($fd, 80);
// Si la fin du fichier n'est pas atteinte
// On peut maintenant afficher la ligne
if (!feof($fd)) echo 'Paquet '.$i.': '.$paquet."\n";
$i++;
}
// On a fini, on ferme !!
fclose($fd);
}
?>
Paquet 1: <?php
// Ouverture du fichier en lecture [option 'r']
// et récupération d'un
Paquet 2: pointeur (ou descripteur de fichier)
// Ici, j'ai utilisé une petite astuce afi
Paquet 3: n d'afficher
// le contenu du fichier constituant ce script
// j'ai donc utilis
Paquet 4: __FILE__ au lieu de spécifier
// un fichier par "/chemin/monfichier"
$fd = fo
Paquet 5: pen(__FILE__,'r');
// si fopen retourne faux c'est que le fichier
// ne peut ê
Paquet 6: tre ouvert en lecture
if (!$fd) {
echo 'Impossible d\'ouvrir le fichier';
}
Paquet 7: else {
$i = 1; // compteur de paquets
// Lorsque nous atteindrons l
Paquet 8: a fin du fichier
// foef($fd) retournera faux
// et la boucle while s'ar
Paquet 9: rêtera
while (!feof($fd)) {
// Il est temps de 80 caractères
Paquet 10: (si possible)
$paquet = fread($fd, 80);
// Si la fin du
Paquet 11: fichier n'est pas atteinte
// On peut maintenant afficher la ligne
Paquet 12: if (!feof($fd)) echo 'Paquet '.$i.': '.$paquet."\n";
$i++;
}
Il est également possible de spécifier un nom de fichier par une url ex: "http://www.site.com/chemin/fichier".
6.11.4.Ecrire dans un fichier
Pour écrire dans un fichier, il faut: ouvrir le fichier en écriture grâce à fopen() et l'option "w" ou "a" (mode ajout [append]), écrire par l'intermédiaire de fwrite(), et à nouveau fermer par fclose().
<?php
// Ouverture du fichier en écriture [option 'w', ou 'a' pour le mode ajout]
// et récupération d'un pointeur (ou descripteur de fichier)
$fd = fopen('chapfile3_1.tmp', 'w');
// si fopen retourne faux c'est que le fichier
// ne peut être ouvert en écriture
if (!$fd) {
echo 'Impossible d\'ouvrir le fichier';
} else {
// juste une boucle d'écriture (totalement bidon)
for ($i=0; $i<20; $i++) {
// j'écris
fwrite($fd, 'Encore une ligne pour rien dire');
}
// On a fini, on ferme !!
fclose($fd);
}
?>
Il est maintenant temps de voir ce que l'on peut faire avec les répertoires.
6.11.5.Lister les fichiers d'un répertoire
Lister le contenu d'un répertoire s'apparente un peu à la lecture d'un fichier. On commence par récupérer un pointeur sur le premier fichier du répertoire et on déplace le pointeur de fichier en fichier jusqu'à atteindre la fin du répertoire.
<?php
// Définition du chemin à explorer (adaptez à votre environnement)
$homedir = __DIR__.'/dossier_exemple_pour_readir';
// "ouverture" du répertoire
$dir = opendir($homedir);
if (false === $dir) {
echo 'Echec: Impossible d\'explorer le dossier';
} else {
// Récupération d'un pointeur sur le premier
// fichier (ou sous-répertoire) du répertoire grâce à readdir.
// Lorsque nous aurons atteint la fin de répertoire
// readdir retournera faux par conséquent
// la boucle s'arrêtera
while ($file = readdir($dir)) {
// Affichage du nom du fichier (ou sous-répertoire)
echo $file."\n";
}
// C'est fini. On ferme !
closedir($dir);
}
?>
fichier1.txt
..
sous_dossier
fichier2.txt
.
Comme vous pouvez le voir sur cet exemple, parmi les répertoires et fichiers, on trouve "." (représentant le répertoire courant) et ".." (représentant le répertoire supérieur). Bien souvent, il faut les ignorer, d'où le nouveau code.
<?php
// Définition du chemin à explorer (adaptez a votre environnement)
$homedir = __DIR__.'/dossier_exemple_pour_readir';
// "ouverture" du répertoire
$dir = opendir($homedir);
if (false === $dir) {
echo 'Echec: Impossible d\'explorer le dossier';
} else {
// Récupération d'un pointeur sur le premier
// fichier (ou sous-répertoire) du répertoire grâce à readdir.
// Lorsque nous aurons atteint la fin de répertoire
// readdir retournera faux par conséquent
// la boucle s'arrêtera
while ($file = readdir($dir)) {
// Affichage du nom du fichier (ou sous-répertoire)
// sauf '.' et '..'
if (($file != '.') && ($file != '..')) echo $file."\n";
}
// C'est fini. On ferme !
closedir($dir);
}
?>
fichier1.txt
sous_dossier
fichier2.txt
Voilà, qui est mieux. Mais parfois, il est utile également d'accéder à la liste des fichiers dans les sous-répertoires. Allez, suivez moi dans le chapitre suivant.
6.11.6.... et de ses sous-répertoires
Pour cela nous devons lister le contenu du répertoire désigné (Cf. chapitre précédent) mais en plus à chaque fois que nous rencontrons un répertoire nous devons (ré-)appliquer ce même algorithme. C'est ce que l'on appelle une fonction récursive.
<?php
// La fonction d'exploration
function explore($cheminDossier, $cheminDossierOrigine = null) {
if (null === $cheminDossierOrigine) $cheminDossierOrigine = $cheminDossier.'/';
$dir = openDir($cheminDossier);
if (false === $dir) {
echo 'Echec: Impossible d\'explorer le dossier';
} else {
while ($file = readDir($dir)) {
if (($file != '.') && ($file != '..')) {
// Est-ce que $file est un répertoire ?
// Pour le savoir il suffit d'appeler is_dir()
// mais attention n'oublions pas d'ajouter
// le chemin au nom du fichier
if (is_dir($cheminDossier.'/'.$file)) {
// oui ? alors explorons-le
// REM: On pourrait en plus l'afficher
explore($cheminDossier.'/'.$file, $cheminDossierOrigine);
} else {
// sinon, c'est un fichier et on l'affiche
$cheminComplet = $cheminDossier.'/'.$file;
// (mais sans la partie $cheminDossierOrigine
// ici __DIR__.'/dossier_exemple_pour_readir)
echo substr($cheminComplet, strlen($cheminDossierOrigine))."\n";
}
}
}
// C'est fini. On ferme !
closeDir($dir);
}
}
// Définition du chemin à explorer (adaptez a votre environnement)
$repertoire = __DIR__.'/dossier_exemple_pour_readir';
// L'appel à la fonction
explore($repertoire);
?>
fichier1.txt
sous_dossier/fichierB.txt
sous_dossier/fichierA.txt
sous_dossier/fichierC.txt
fichier2.txt