Début de la boite de navigation du chapitre

Parfois l’utilisation de fichier peut être très utile dans certains script, par exemple pour un système de cache ou autre.
Dans ce cours nous allons voir comme interagir avec un fichier.

Fichiers
Icône de la faculté
Chapitre no 12
Leçon : PHP
Chap. préc. :Cookies
Chap. suiv. :Mails
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « PHP : Fichiers
PHP/Fichiers
 », n'a pu être restituée correctement ci-dessus.

Droits des fichiers

modifier

Windows

modifier

Sous Windows il suffit de se rendre dans l'onglet sécurité des propriétés d'un fichier, pour cocher les cases autorisant le programme à le lire et/ou le modifier.

chmod est le système de droit d'accès a un fichier Unix. Il s'agit d'un nombre à 3 chiffres que l’on attribut à un fichier (ex. : 755). Il détermine le droit d'accès au fichier en question, qui peut le modifier.
Selon sa valeur le système d'exploitation (OS) autorise ou non la modification du fichier. Sous GNU/Linux, l'utilisateur 'root', (superutilisateur), a tous les droits, c'est-à-dire qu’il peut modifier tous les fichiers.

Lorsque qu'un fichier est créé manuellement, le chmod du fichier en question est 755, avec un tel chmod nous ne pouvons pas modifier le fichier avec un script PHP. Pour pouvoir le modifier, il suffit juste de changer le chmod du fichier, en lui donnant la valeur 766. Sous Windows, cette notion est masquée et il suffit d’être administrateur de la machine (utilisateur par défaut) pour pouvoir modifier un fichier.

Ouvrir et fermer un fichier

modifier

Créer un fichier avec un attribut chmod de 766. Ensuite il faut ouvrir le fichier en question avant de lire/écrire. Pour cela la fonction fopen est là :

Début d’un principe
Fin du principe


Explication : La fonction fopen à besoin de deux paramètres pour pouvoir s'exécuter :

  • $NomFichier, il s'agit du chemin du fichier
  • $mode, il s'agit du mode de l'ouverture

La fonction fopen utilise le premier paramètre, pour déterminer le chemin du fichier a ouvrir/créer.

Voici les différents modes d'ouvertures pour la fonction fopen :

Mode Description
r Ouvre en lecture seule, et place le pointeur de fichier au début du fichier.
r+ Ouvre en lecture et écriture, et place le pointeur de fichier au début du fichier.
w Ouvre en écriture seule, et place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
w+ Ouvre en lecture et écriture, et place le pointeur de fichier au début du fichier et réduit la taille du fichier à 0. Si le fichier n'existe pas, on tente de le créer.
a Ouvre en écriture seule, et place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, on tente de le créer.
a+ Ouvre en lecture et écriture, et place le pointeur de fichier à la fin du fichier. Si le fichier n'existe pas, on tente de le créer.
x Créé et ouvre le fichier en lecture seule ; place le pointeur de fichier au début du fichier.

Si le fichier existe déjà, fopen() va échouer, en retournant FALSE et en générant une erreur de niveau E_WARNING. Si le fichier n'existe pas, fopen() tente de le créer. Ce mode est l'équivalent des options O_EXCL|O_CREAT pour l'appel système open(2) sous-jacente. Cette option est supportée à partir de PHP 4.3.2 et fonctionne uniquement avec des fichiers locaux.

x+ Crée et ouvre le fichier en lecture et écriture ; place le pointeur de fichier au début du fichier.

Si le fichier existe déjà, fopen() va échouer, en retournant FALSE et en |générant une erreur de niveau E_WARNING. Si le fichier n'existe pas, fopen() tente de le créer.

Pour le fermer maintenant, il y a la fonction fclose.

Début d’un principe
Fin du principe


Copier un fichier

modifier
if (!copy($AncienFichier, $NouveauFichier)) {
    echo 'La copie a échoué.';
}

Pour les images il existe aussi imagecopyresampled[1].

Supprimer un fichier

modifier
if (!unlink($Fichier)) {
    echo 'La suppression a échoué.';
}

Interagir avec le fichier

modifier

Lecture

modifier

Une fois ouvert, il existe plusieurs manière de lire le contenu d'un fichier : caractère par caractère, ligne par ligne, jusqu'à une certaine taille, ou tout entier.

La méthode la plus simple est de lire ligne par ligne avec la fonction fgets, dont la définition est la suivante :

Début d’un principe
Fin du principe


La variable $ObjetFichier doit être le résultat de l'ouverture d'un fichier avec fopen. Pour lire un fichier en entier, il suffit d’utiliser fgets en boucle ; la condition de sortie de la boucle serait alors l'arrivée à la fin de fichier, évènement notifié par la fonction feof.

Début de l'exemple
Fin de l'exemple


La fonction équivalente pour lire caractère par caractère se nomme fgetc :

Début d’un principe
Fin du principe


Notez que cette fonction retourne FALSE arrivée à la fin du fichier. Lors d'un parcours, il faut donc tester impérativement la valeur avant de l’utiliser, avec un test logique de la forme « $caractere !== FALSE ».

Pour lire le fichier en entier, utiliser file() :

Début d’un principe
Fin du principe

Ainsi, $fichier[0] correspond à la première ligne, $fichier[1] à la seconde, etc.

Écriture

modifier

Une fois le fichier ouvert, l'écriture se fait via la fonction fwrite.

Début d’un principe
Fin du principe


Explication :

  • $ObjetFichier : variable pointant vers un fichier ouvert avec fopen
  • $chaine : la chaîne à écrire dans le fichier
  • retour : le nombre de caractère écrits, ou FALSE si erreur

L'utilisation est alors la même que pour la lecture : ouvrir le fichier, écrire et fermer.

Début de l'exemple
Fin de l'exemple


Attention : Si vous ouvrez le fichier avec l'option w ou w+, le contenu du fichier sera effacé s'il existait. Pour écrire à la fin, il faut ouvrir avec les options a ou a+ (voir ci-dessus). Enfin, si vous pouvez avec l'option r+, le contenu sera écrasé, puisque le pointeur de fichier sera placé au début.

Se déplacer

modifier

Parfois, il peut être nécessaire de se déplacer dans le fichier, par exemple pour revenir au début. Pour cela, il faut utiliser la fonction fseek comme suit :

Début d’un principe
Fin du principe

Explication :

  • $ObjetFichier : variable pointant vers un fichier ouvert avec fopen
  • $position : la position à laquelle on veut se déplacer. Pour revenir au début, $position doit valoir zéro.

Fichiers uploadés

modifier

Copier-coller ces lignes dans un fichier vierge upload.php pour qu’il affiche le nom des fichiers qu'on upload avec :

<?php
echo '
<form method="POST" action="upload.php" enctype="multipart/form-data">
     <input type="file" name="fichier">
     <input type="submit" name="envoyer" value="Uploader">
</form>';
if (isset($_FILES['fichier']))
{
  echo $_FILES['fichier']['name'];
}
?>

Fichiers distants

modifier

Pour lire un fichier en HTTP (par exemple cette page web) :

<?php
$page = file_get_contents("http://fr.wikiversity.org/wiki/PHP/Fichiers/");
echo $page;
?>

ou[2]

<?php
$url = 'http://fr.wikiversity.org/wiki/PHP/Fichiers/';
echo htmlspecialchars(implode('', file($url)));
?>

Déposer un fichier (sans vérifier s'il en écrase un)[3] :

<?php
copy('fichier_local.txt', 'ftp://login:password@server/repertoire/fichier_distant.txt');
?>

Souvent le répertoire porte le nom de l'utilisateur, et on écrase le fichier s'il existe :

<?php
$serveur = 'serveur1';
$login = 'utilisateur1';
$password = 'mdp1';
$fichier = 'fichier1';
copy($fichier, 'ftp://'.$login.':'.$password.'@'.$serveur.'/'.$login.'/'.$fichier, stream_context_create(array('ftp' => array('overwrite'=>True))));
?>

Fonctions propres au FTP, pour lire un serveur distant, y télécharger et déposer des fichiers[4] :

$cnx = ftp_connect($serveur);
$login_result = ftp_login($cnx, $login, $password);

// Liste des noms des dossiers et fichiers du dossier distant (dans le désordre)
$DossierDistant = ftp_nlist($cnx, ".");
var_dump($DossierDistant);

// Liste des éléments du dossier distant avec leurs inodes
$DossierDistant2 = ftp_rawlist($cnx, ".");
var_dump($DossierDistant2);

// Téléchargement du dernier fichier distant
sort($DossierDistant);
$distant = $DossierDistant[sizeof($DossierDistant)-1];
$local = 'FichierLocal.txt';
if (!ftp_get($cnx, $local, $distant, FTP_BINARY)) {
    echo "Erreur ftp_get\n";
} else {
    ftp_delete($cnx, $distant);
}

// Téléversement d'un fichier local
$local = 'FichierLocal2.txt';
if (!ftp_put($cnx, $distant, $local, FTP_ASCII)) {
    echo "Erreur ftp_put\n";
}

Extraction regex

modifier

Pour filtrer le contenu d'un fichier, par exemple récupérer tout ce qui se trouve entre parenthèses dans un tableau, en expressions rationnelles :

$regex = "/\(([^)]*)\)/";
preg_match_all($regex, file_get_contents($NomFichier), $matches);
print_r($matches);

Voir aussi Programmation PHP/Expression Régulière sur Wikilivres  .

Références

modifier
  1. http://php.net//manual/fr/function.imagecopyresampled.php
  2. developpez.net
  3. http://php.net/manual/fr/book.ftp.php
  4. http://php.net/manual/fr/function.ftp-nlist.php