PHP - MySQL [Retour au menu]
Gestion générale des fichiers

Gestion globale des fichiers

Lecture du fichier actuel

Le fichier actuel se trouve dans 2 constantes :

Les résultats sont un peu différents, __FILE__ est plus complet:

echo $REQUEST_URI;
renvoie :
/dossier/sousdossier/fichierquelconque.php

echo __FILE__;
renvoie :
/home/sites/site18/web/dossier/sousdossier/fichierquelconque.php

Notez que dans aucun des cas nous n'avons un URI qui commence par http://www...

Inter-réaction avec les fichiers inclus

ATTENTION : différence fondamentale entre les deux constantes $REQUEST_URI et __FILE__:

Imaginons le cas suivant :

un fichier test.php :

<html><head> <title></title> </head>
<body>

  <? include ("testinclude.php"); ?>
</body>
</html>

et le fichier inclus testinclude.php :

<?
echo "request_uri : ".$REQUEST_URI;
echo "<BR>";
echo "file : ".__FILE__;
?>

Que va-t-il afficher ? test.php ou testinclude.php ? En fait, voici l'affichage :

requesturi : /eclat2/test/test.php
file : /home/sites/site23/web/eclat2/test/testinclude.php

Donc, on va utiliser __FILE__ si on désire le nom du fichier inclus, et $REQUEST_URI si on veut le fichier appelant.

Pour n'avoir que le nom du fichier (la fin de l'URL, a partir du dernier /, en excluant celui ci :
echo str_replace("/", "", strrchr(__FILE__,"/"));
echo str_replace("/", "", strrchr($REQUEST_URI,"/"));

Pour avoir le nom du fichier, sans son extension (machin de machin.inc.php par exemple) :

// Récupération de la fin de la chaîne (dès le dernier / ):
$Fichier = str_replace("/", "", strrchr(__FILE__,"/")); // ou $REQUEST_URI bien sûr
// On parcourt la chaîne jusqu'au premier point rencontré :
for ($Ctr=0 ;$Ctr<=strlen($Fichier);$Ctr++)
  {
  if ($Fichier[$Ctr] == ".") break;
  $FichierSansExt = $FichierSansExt.$Fichier[$Ctr];
  }
echo $FichierSansExt;

Création d'un fichier vide

touch("monfichier.dat")

Tel fichier existe-t-il ?

echo file_exists("trucmachin.txt");

Renommer un fichier

rename("anciennom.txt" , "nouveaunom.txt");

Voir la taille d'un fichier

$fichier="test.txt";
$ligne=file($fichier);
echo sizeof($ligne); // Nombre de lignes
echo filesize($ligne); // Nombre de caractères

Ouverture et fermeture du dossier courant : opendir et closedir

$DossierCourant = opendir(".");
closedir($DossierCourant);

Lecture et affichage du premier fichier trouvé : readdir

$DossierCourant = opendir(".");
$UnFichier = readdir($DossierCourant);
echo $UnFichier;
closedir($DossierCourant);

A chaque lecture de readdir($DossierCourant), on va avancer d'un fichier à afficher, comme ceci :

$DossierCourant = opendir(".");
$UnFichier = readdir($DossierCourant);
echo $UnFichier , "<BR>";
$UnFichier = readdir($DossierCourant);
echo $UnFichier , "<BR>";
$UnFichier = readdir($DossierCourant);
echo $UnFichier , "<BR>";
$UnFichier = readdir($DossierCourant);
echo $UnFichier , "<BR>";
closedir($DossierCourant);

Affichera selon le contenu du dossier courant :

.
..
UnFichierQuelconque.htm
UnAutreFichierExemple.php

Créer une boucle pour l'affichage de tous les fichiers d'un dossier

Nous avons vu qu'a chaque appel de readdir, on avance d'un fichier. Vient un moment ou tout le dossier courant a été parcouru. Dès ce moment, $UnFichier = readdir($DossierCourant); ne contient plus rien. C'est cette particularité que nous allons utiliser avec while : Nous allons en une seule ligne affecter la variable $UnFichier=readdir($DossierCourant), et la comparer avec une chaîne vide : <> "".

$DossierCourant = opendir(".");
while (($UnFichier=readdir($DossierCourant)) <> "")
  echo $UnFichier , "<BR>";
closedir($DossierCourant);

Et, en fait, nous n'avons pas besoin de faire la comparaison <> "", car la simple affectation $UnFichier=readdir($DossierCourant) suffit à ce que la comparaison soit vraie. L'écriture condensée suivante est suffisante, et très usitée :

$DossierCourant = opendir(".");
while ($UnFichier=readdir($DossierCourant))
  echo $UnFichier , "<BR>";
closedir($DossierCourant);

L'affichage sera le suivant selon le contenu du dossier:

.
..
index.htm
MachinBidule.php
FichierDebile.php
Oulala.txt

Supprimer les deux fichiers . et ..

$DossierCourant = opendir(".");
while (($UnFichier=readdir($DossierCourant)) <> "")
  {
  if (($UnFichier <> ".") && ($UnFichier <> ".."))
    echo $UnFichier , "<BR>";
  }
closedir($DossierCourant);

Cas sympathique : Créer un lien hypertexte vers chacun des fichiers existants

Il s'agit d'abord de se remémorer la syntaxe HTML pour créer un lien hypertexte :
<a href="UnFichierDebile.htm">Cliquez ici pour aller au fichier débile</a>

Maintenant, c'est un jeu d'enfant de faire l'affichage en utilisant la concaténantion :

if (($UnFichier <> ".") && ($UnFichier <> ".."))
  echo "<A HREF=" , $UnFichier , ">" , $UnFichier , "</A><BR>";

Il y a 2 fois $UnFichier, une fois pour faire le lien hypertexte, et une fois pour l'afficher.

La même chose, mais en supprimant de la liste tous les fichiers qui n'ont pas pour extension .htm

Il s'agit de récupérer l'ensemble des fichiers qui se terminent par .htm. Pour ce faire, nous allons utiliser la fonction de recherche de chaîne eregi, telle qu'elle est expliquée dans le chapitre Chaînes de caratères.

Rappel :
eregi ("(.*).htm" , "MachinBidule.htm" , $Stockage);
echo $Stockage[1];

va afficher
MachinBidule

Et si le fichier ne se terminait pas par .htm, l'affichage aurait été ... Rien du tout !

Voici le code complet final de l'ensemble de tous les fichiers se terminant par .htm, avec un lien hypertexte qui pointe vers eux

$DossierCourant = opendir(".");
while (($UnFichier=readdir($DossierCourant)) <> "")
  {
  if (($UnFichier <> ".") && ($UnFichier <> ".."))
    {
    eregi ("(.*).htm" , $UnFichier , $Stockage);
    if ($Stockage[1])
      echo "<A HREF=" , $UnFichier , ">" , $UnFichier , "</A><BR>";
    }
  }
closedir($DossierCourant);

---