• Aucun résultat trouvé

ses fichiers et sous-répertoires (création, suppression, modification du nom, copie, modification des droits)

Dans le document formations web (Page 72-75)

Cet article explique :

• Comment manipuler les répertoires avec PHP.

Ce qu'il faut savoir :

• Vous devez connaître les bases du langage PHP.

Niveau de difficulté

Figure 1. Contenu du répertoire lavandou

$rep = @opendir('lavandou') or die('erreur ouverture');

L’identifiant de ressource est stocké dans la variable $rep. En cas d’erreur le message

erreur ouverture est affiché et le script est interrompu. Le message d’alerte envoyé par PHP, en fonction des réglages dans le fichier de configuration php.ini, est bloqué par l’uti-lisation de l’opérateur de contrôle d’erreur

@. Sur un serveur en production, ce type de message d’alerte PHP ne doit pas être affi-ché (la directive display_errors a la valeur

off). L’utilisation de l’opérateur de contrô-le d'erreur @ permet cependant de s’assurer qu’aucun message d’alerte ne s’affiche, quels que soient les réglages du php.ini.

Lire les éléments

Un répertoire peut contenir des fichiers, des liens symboliques et des sous-répertoi-res. Il contient également toujours deux élé-ments spéciaux qui font référence au réper-toire lui-même (le point) et au réperréper-toire parent (le double point). Vous rencontrerez ces deux symboles dans les exemples de cet article.

Pour lire le contenu d’un répertoire, il faut utiliser la fonction readdir qui prend en argument l’identifiant de ressource et qui retourne une chaîne de caractères.

Celle-ci correspond à un élément du réper-toire. Pour lire l’ensemble des éléments du répertoire, il faut donc utiliser une boucle.

La fonction readdir retourne false une fois le répertoire parcouru. Cette fonction permet de satisfaire la condition d’arrêt de la boucle. Le code ci-après parcourt tout le répertoire lavandou (la variable $rep cor-respond à l’identifiant de ressource sur ce répertoire) et affiche chaque élément du répertoire. Seuls les fichiers et noms de ré-pertoires du premier niveau hiérarchique seront affichés :

while ($entree = readdir($rep)){

echo "$entree<br>";

}

Fermer le répertoire

La fonction closedir ferme le répertoire dont l’identifiant de ressource est passé en argument. Si aucun argument n’est donné, la fonction ferme par défaut la dernière ressour-ce ouverte avec la fonction opendir. La ligne de code suivante permet de fermer le réper-toire lavandou :

@closedir($rep);

Un premier exemple

L’exemple du Listing 1 parcourt le premier niveau du répertoire lavandou, et n’affiche

que les noms de fichiers. Vous verrez dans la section suivante comment parcourir les sous-répertoires. Ce premier exemple simple illus-tre l’ouverture, le parcours et la fermeture de répertoire.

Après avoir ouvert le répertoire lavandou avec la fonction opendir, le script PHP, situé au même niveau que ce répertoire, parcourt les éléments du répertoire grâce à l’emploi de la fonction readdir et de la boucle while. L’identifiant de ressource passé en paramètre à la fonction readdir pointe sur le répertoire lavandou.

Pour chaque élément du répertoire, le test vérifie avec la fonction is_file que l’élément courant dans la boucle est un fichier. Cette fonction prend en paramètre le chemin d’ac-cès au fichier et retourne un booléen, avec la

valeur true si le chemin donné aboutit bien à un fichier.

Chaque élément lu par la fonction readdir

dans la boucle est situé au niveau inférieur du répertoire. La fonction readdir retourne le nom d’une entrée du répertoire, aucune in-formation sur le chemin n’est donnée dans la chaîne retournée. Pour cette raison, toutes les opérations effectuées sur les éléments du ré-pertoire lavandou doivent indiquer le chemin d’accès à ces éléments, à partir du répertoire où le script est exécuté. Par exemple, lorsque l’entrée lue par la fonction readdir est le fi-chier contact.html, si la fonction is_file est appliquée directement sur la chaîne retour-née par readdir, alors l’existence du fichier est vérifiée dans le répertoire courant. Dans ce cas, le répertoire courant est celui du script Listing 1. parcours.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/

html4/strict.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Manipulation de repertoires</title>

// initialiser le chemin d'accès au répertoire

$chemin = 'lavandou'; // ouvrir le répertoire

$rep = @opendir($chemin) or die('Erreur ouverture');

// parcourir les éléments du répertoire while ($entree = readdir($rep)){

// si l'élément courant est un fichier if (is _ file("$chemin/$entree")){

echo "$entree est un fichier de ", filesize("$chemin/$entree"),

" octets<br>";

} }

// libérer la ressource @closedir($rep);

?>

</div>

</body>

</html>

Listing 2. parcours_fi chiers_html.php

<?php

// changer de répertoire de travail

chdir('lavandou') or die('Operation impossible');

// ouvrir le répertoire courant

$rep = @opendir('.') or die('Erreur ouverture');

// parcourir les éléments du répertoire while ($entree = readdir($rep)){

// si l'élément courant a pour extension "html"

if (pathinfo($entree, PATHINFO _ EXTENSION) == 'html'){

echo "$entree (date : ", date("d-m-Y H:i:s", filemtime($entree)), ")<br>";

} }

// libérer la ressource @closedir($rep);

?>

Pour les débutants

PHP et non pas le répertoire lavandou parcou-ru par readdir. Il faut ajouter le chemin d’ac-cès au fichier à partir du répertoire courant, c’est ce qui est réalisé avec le code $chemin/

$entree dans le Listing 1.

Dans la Figure 1 vous pouvez voir que le répertoire lavandou contient au premier niveau trois répertoires (hotel, mini-golf etplage) et trois fichiers (contact.html,

in-dex.html et style.css). Le code du Listing 1 retournera donc trois lignes de résultats, une pour chaque fichier du répertoire.

Chaque ligne comporte le nom du fichier et sa taille, grâce à la fonction filesize, qui prend en argument le chemin d’accès à un fichier et retourne la taille du fichier demandé en octets. Le résultat affiché par le Listing 1 est :

contact.html est un fichier de 654 octets

index.html est un fichier de 900 octets

style.css est un fichier de 22 octets

Afficher les fichiers HTML

Dans l’exemple précédent le nom du réper-toire était passé à la fonction opendir. Il est possible de préciser le répertoire de tra-vail avec la fonction chdir. Cette dernière prend en argument le chemin du répertoi-re de travail voulu et répertoi-retourne un booléen (false en cas d’échec). Dans l’exemple du Listing 2, le répertoire de travail devient le répertoire lavandou après l’appel à la fonction chdir. La fonction opendir ouvre donc ce répertoire. En effet, elle prend en argument le symbole point qui représen-te le répertoire courant. Contrairement à l’exemple du Listing 1, il n’est plus néces-saire d’indiquer le chemin d’accès complet aux éléments du répertoire. Ainsi la fonc-tion filemtime prend directement en ar-gument l’élément $entree. Vous avez ren-contré cette fonction dans l’article sur la manipulation de données dans les fichiers.

Elle retourne un timestamp correspondant à la date de dernière modification du fi-chier. La fonction date permet d’afficher cetimestamp dans un format lisible par un humain.

Vous pouvez à tout moment connaître le répertoire de travail en utilisant la fonc-tiongetcwd. Elle retourne le chemin com-plet du répertoire sur le disque. Par défaut le répertoire de travail est celui du script exécuté.

Le Listing 2 filtre les éléments du ré-pertoire lavandou pour n’afficher que les éléments dont l’extension est html. Pour ce faire, la fonction pathinfo est utili-sée. Elle retourne des informations sur le fichier ou répertoire dont le chemin est passé en premier argument. Le second ar-gument permet de préciser l’information souhaitée : liste des répertoires du chemin (constante PATHINFO_DIRNAME), nom du fi-chier avec extension ou nom du dernier ré-pertoire du chemin s’il n’y a pas de fichier (PATHINFO_BASENAME), nom du fichier sans son extension (PATHINFO_FILENAME), ex-tension du fichier (PATHINFO_EXTENSION).

La fonction permet de récupérer l’ensem-ble de ces informations dans un tal’ensem-bleau associatif lorsqu’elle ne reçoit pas de se-cond argument.

Le résultat affiché par le Listing 2 est :

contact.html (date : 07-08-2009 17:06:54)

index.html (date : 05-08-2009 14:22:35) Figure 2. Parcours du répertoire lavandou

Listing 3. parcours_recursif.php

<?php

function parcoursRep($chemin) {

// si c'est un fichier, renvoyer le nom du fichier

if (is _ file($chemin)) {

return "<li>".basename($chemin)."</li>";

}

// si c'est un répertoire, traiter son contenu

if (is _ dir($chemin)) {

// stocker le nom du répertoire

$res = "<li>".basename($chemin)."<ul>";

// ouvrir le répertoire

$rep = @opendir($chemin) or die('Erreur ouverture');

// parcourir les éléments du répertoire while ($entree = readdir($rep)){

// ne pas traiter le répertoire courant ou parent if ( ($entree != '.') && ($entree != '..') ){

// récursion : traiter les éléments du répertoire

$res .= parcoursRep("$chemin/$entree"); }

}

$res .= "</ul></li>";

// libérer la ressource @closedir($rep);

return $res;

} }

echo "<div id='repertoire'><ul>";

echo parcoursRep('lavandou'); echo "</ul></div>";

?>

Abonnement à un prix

Dans le document formations web (Page 72-75)

Documents relatifs