Principes de programmation
Gestion des fichiers
2526 · Dekens Antoine
Persistance des données
Pour permettre de sauvegarder des données sur un serveur (Persistance), nous avons deux possibilités :
- Sauvegarder et récupérer les données dans un fichier (.txt, .json, .yml, etc.).
- Interagir avec un SGDB.
fopen
La fonction fopen permet d'ouvrir un fichier et s'il existe de renvoyer un pointeur (notre position dans le fichier). Nous devons lui passer 2 paramètres :
- filename : l'url du fichier à ouvrir
- mode : indique le mode d'ouverture
Paramètre mode
Le paramètre mode a plusieurs valeurs possibles, nous n'en verrons que 3 :
- r (read) : ouvrre en lecture seule avec un pointeur en début de fichier.
- w (write) : ouvre en écriture seule, place le pointeur en début de fichier et supprime son contenu actuel. Si le fichier n'existe pas on tente de le créer.
- a (add) : ouvre en écriture seule et place le pointeur en fin de fichier ce qui nous permet d'ajouter du contenu. Si le fichier n'existe pas on tente de le créer.
Valeurs de retour
- false : n'a pas pu ouvrir le fichier (mauvais chemin, pas les droits, etc.)
- pointeur : le fichier est ouvert à une certaine position (dépendant du mode)
<?php
// On stocke le chemin vers un fichier à ouvrir
$pathToMyFile = "path/to/my/file.txt";
// Demande d'ouverture du fichier
// en lecture seule (mode "r")
$filePointer = fopen( $pathToMyFile, "r" );
if( $filePointer ){
echo "Le fichier existe et est correctement ouvert";
} else {
echo "Fichier inexistant ou ne peut être ouvert";
}
?>
fclose
La fonction fclose permet de fermer le fichier précédemment ouvert en lui passant un paramètre :
- file pointer : le pointeur du fichier ouvert (la réponse de fopen).
Valeurs de retour
- false : une erreur s'est produite lors de la fermeture
- true : le fichier à bien été fermé
<?php
…
$fileClosed = fclose( $filePointer );
// Si ce n'a pas fonctionné on affiche l'erreur
if( !$fileClosed ){
echo "Une erreur est survenue lors de la fermeture.";
}
?>
<?php
$fileClosed = fclose( $filePointer );
// Si ce n'a pas fonctionné on affiche l'erreur
if( !$fileClosed ){
echo "Une erreur est survenue lors de la fermeture.";
}
?>
Exercice A
Créer un fichier getFile.php et utiliser les fonctions fopen et fclose pour ouvrir le fichier manga.txt ci-dessous. Le but est de pouvoir afficher avec echo les différents scénarios possibles (réussite et échec d'ouverture et de fermeture).
N'oublions pas d'avoir un squelette HTML valide.fgetc
La fonction fgetc permet de lire un caractère et d'avancer le pointer au caractère suivant avec un paramètre :
- file pointer : le pointeur du fichier ouvert (la réponse de fopen).
Valeurs de retour
- false : une erreur s'est produite lors de la lecture ou la fin du fichier a été atteinte.
- string : le caractère lu sous forme de string
<?php
$filePointer = fopen( 'path/to/my/file.txt', 'r' );
if( $filePointer ){
$lastLetter = fgetc( $filePointer );
if( $lastLetter ){
echo "La dernière lettre lue est $lastLetter.";
} else {
echo 'Erreur ou fin de fichier.'
}
… // Fermeture de fichier
} else { … } // Erreur d'ouverture
?>
feof
La fonction feof vérifie si le pointeur a atteint la fin du fichier avec un paramètre :
- file pointer : le pointeur du fichier ouvert (la réponse de fopen).
Valeurs de retour
- false : le pointeur n'a pas atteint la fin du fichier.
- true : le pointer a atteint la fin du fichier ou qu'une erreur s'est produite.
<?php
$filePointer = fopen( 'path/to/my/file.txt', 'r' );
if( $filePointer ){
// Tant que le pointeur n'a pas atteint la fin du fichier
// la boucle while permet de parcourir tout les caractères du fichier.
while( !feof( $filePointer ) ){
$lastLetter = fgetc( $filePointer );
if( $lastLetter ){
echo "La dernière lettre lue est $lastLetter.";
}
}
… // Fermeture de fichier
} else { … } // Erreur d'ouverture
?>
Exercice B
Sur base de l'exercice précédent, afficher chaque lettre du fichier manga.txt avec un retour à la ligne :
<?php
// Retour à la ligne
echo "<br>";
?>
fgets
La fonction fgets permet retourner la ligne courante où se situe notre pointer et de l'avancer au début de la prochaine ligne avec un paramètre :
- file pointer : le pointeur du fichier ouvert (la réponse de fopen).
Valeurs de retour
- false : une erreur s'est produite lors de la lecture ou la fin du fichier a été atteinte.
- string : une chaîne de caractères contenant la ligne lue
<?php
$filePointer = fopen( 'path/to/my/file.txt', 'r' );
if( $filePointer ){
$lastLine = fgets( $filePointer );
if( $lastLine ){
echo "La dernière ligne lue est $lastLine.";
} else {
echo 'Erreur ou fin de fichier.'
}
… // Fermeture de fichier
} else { … } // Erreur d'ouverture
?>
Exercice C
Sur base de l'exercice précédent, afficher chaque ligne du fichier manga.txt avec un retour à la ligne :
fwrite
La fonction fwrite permet d'écrire une chaîne de caractère(s) dans le fichier, à l'endroit du pointeur. Deux paramètres sont nécessaires :
- file pointer : le pointeur du fichier ouvert (la réponse de fopen).
- data : la chaîne de caractère(s) à insérer
Valeurs de retour
- false : une erreur s'est produite
- number : le nombre de caractère(s) inséré(s) si l'écriture a réussie
<?php
$filePointer = fopen( 'path/to/my/file.txt', 'w' );
if( $filePointer ){
$stringToInsert = "Coucou";
$charsCount = fwrite( $filePointer, $stringToInsert );
if( $charsCount ){
echo "le nombre de caractère(s) inséré(s) est $charsCount.";
} else {
echo 'Erreur ou fin de fichier.'
}
… // Fermeture de fichier
} else { … } // Erreur d'ouverture
?>
Exercice D
Sur base de l'exercice précédent, afficher les informations sous forme de tableau en HTML. La fonction explode est a utiliser.
Exercice E
Sur base de l'exercice précédent, ajouter une nouvelle ligne à la suite de notre fichier en y ajoutant un titre, un auteur ainsi que son/ses genre(s) et afficher le tout dans le tableau.
Comme les informations sont affichées via un explode, il faudra insérer les données en respectant la structure du fichier originel.