Listage répertoires/sous répertoires + fichiers

Soyez le premier à donner votre avis sur cette source.

Vue 10 277 fois - Téléchargée 853 fois

Description

On met le script dans un repertoire, on l'execute et il nous retourne les reptertoires avec leur contenu ainsi que les sous-répertoires et leur contenu ...

Source / Exemple :


<?
/************************************************************************/
/* listage.php: liste tous les répertoires/sous-répertoires et fichiers */
/* ==================================================================== */
/*                                                                      */
/* titiplusplus titiplusplus@titiplusplus.com							*/
/* http://ebc.titiplusplus.com titi_plusplus@hotmail.com				*/
/*                                                                      */
/* Mettez le script dans le répertoire à lister et executez le.			*/
/* Pour un répertoire exclus du serveur web (doc root) executez-le		*/
/* avec php.exe en ligne de commande :									*/
/* ex : php.exe listage.php > listage.html puis ouvrez listage.html		*/
/************************************************************************/
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> Listage des répertoires </TITLE>

</HEAD>
<BODY>
<?php

//classe "récursive" repertoire

$idclass=0;

class repertoire
{
	//propriétés
	var $id;//identifiant unique de la classe
	var $chemin;//chemin du répertoire en cours
	var $nom;//nom du répertoire en cours
	var $listRep;//tableau des classes filles (ou sous classes)
	var $listFiles;//tableau des noms + dates de modification des fichiers du répertoire en cours

	//constructeur
	function repertoire($inChemin,$inNom)
	{
		global $idclass;

		$this->id=$idclass;
		
		$this->chemin=$inChemin;
		$this->nom=$inNom;

		$idclass++;//incrémentation pour la prochaine classe

		if($inChemin!="")//déduction du chemin complet du repertoire
		{
			$fullpath=$inChemin."/".$inNom;
		}
		else
		{
			$fullpath=$inNom;
		}

		$handle=opendir($fullpath);

		$tmp=0;//var d'increment -> tableau de sous classes
		$tmp2=0;//var d'increment -> tableau de fichiers

		while ($file = readdir($handle))//création des sous classe
		{
			if (is_dir($fullpath."/".$file) && $file != "." && $file != "..")
			{
				//instanciation d'une nouvelle classe depuis cette classe
				//j'appelle ça des classes récursives :-)
				//tant qu'il y aura des sous répertoires des sous classes seront créees ...
				//ex : pour rep1/rep2/rep3 => classe1->sousclasse2->sousclasse3 etc ...
				//les unes imbriquées dans les autres :-P et accessibles avec le tableau listRep
				$this->listRep[$tmp]=new repertoire($fullpath,$file);
				$tmp++;
			}
			else if(is_file($fullpath."/".$file) && $file != "." && $file != "..")
			{
				clearstatcache();//effacement du cache (conseillé dans la doc ... donc on le fait :-)
				//liste des fichiers + date modif
				$this->listFiles[$tmp2]="<td>".$file."</td><td>".date("d/m/y H:i",fileatime($fullpath."/".$file))."</td>";
				$tmp2++;
			}
		}

		closedir($handle);
	}

	//fonction d'affichage en html
	function toString()//un peu comme le toString() en java
	{
		echo"<table border=1 border=0 cellspacing=0 cellpadding=0>
		<tr><td colspan=2 align=center><b><FONT SIZE=2 COLOR=red>".$this->nom."</FONT></b></td></tr>\n";
		for($i=0;$i<count($this->listFiles);$i++)
		{
			echo"<tr><FONT SIZE=2 >".$this->listFiles[$i]."</FONT></tr>\n";
		}
		for($i=0;$i<count($this->listRep);$i++)
		{
			//on appelle les toString() des classes filles
			echo"<tr><td colspan=2></td></tr><tr>
				<td align=center valign=top><b><!-- <FONT SIZE=2 COLOR=red>".$this->nom."</FONT> --></b></td>
				<td>";
			$this->listRep[$i]->toString();
			echo"</td>";
			echo"</tr>\n";
		}
		echo"</table>\n";
	}
}

//DEBUT

$j=0;
$path='.';

$handle=opendir($path);
//listage des repertoires du répertoire où se trouve le script
while ($file = readdir($handle))
{
    if (is_dir($file) && $file != "." && $file != "..")
	{
		$repertoire=new repertoire($path,$file);
		$repertoire->toString();
    }
}

closedir($handle);

//FIN

//voilou ... simple et efficace à souhait :-P
?>
</BODY>
</HTML>

Conclusion :


On pourrait afficher plus d'infos mais bon ... le but de ce script n'est pas là ... il s'agissait de travailler un peut les objets :-P

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
6 juin 2005 à 19:53
Hé bien si tu veux décaler les sous-répertoires, laisse les tableaux comme ils sont et décale ceux des sous-répertoires!?
footixgh Messages postés 1 Date d'inscription vendredi 17 octobre 2003 Statut Membre Dernière intervention 5 juin 2005
5 juin 2005 à 20:06
Bonjour, Avec votre système, un nouveau tableau est créé dans un tableau pour les sous-dossiers par exemple.
J'ai adapté votre code pour que tout s'affiche dans un seul tableau afin d'en faire un menu automatique.
Mais j'aimerais décaler les sous répertoires. Comment faire? Comment savoir si ce qui va être écris est un sous répertoire ou un répertoire?

Merciiiii
neouf Messages postés 1 Date d'inscription samedi 11 novembre 2000 Statut Membre Dernière intervention 17 mars 2005
17 mars 2005 à 10:53
if (is_dir($path.'/'.$file) && $path.'/'.$file != "." && $path.'/'.$file != "..")

avec ca , un meilleur fonctionnement est visible avec des chemins unix,
et voilou :)
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
22 févr. 2005 à 23:57
Hum ça marchera mieux si vous sortez la fonction de la boucle lol
Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
20 févr. 2005 à 15:40
Joli code!
J'ai ajouté ceci pour que les fichiers soient aussi des liens (la fonction marche avec les espaces et les accents utilisés en français principalement, pour le reste faîtes des recherches :^) :

A un moment vous allez remplacer:

//liste des fichiers + date modif
$this->listFiles[$tmp2]="<td>".$file."</td><td>".date("d/m/y H:i",fileatime($fullpath."/".$file))."</td>";


Par:

//liste des fichiers + date modif
function accent($mot)
{
for($i=0;$i<strlen($mot);$i++)
{
$car=substr($mot,$i,1);
$val=ord($car);
if ($val==192){$car='%c0';}
if ($val==194){$car='%c2';}
if ($val==199){$car='%c7';}
if ($val==212){$car='%d4';}
if ($val>=224){$car='%e0';}
if ($val>=226){$car='%e2';}
if ($val==231){$car='%e7';}
if ($val==232){$car='%e8';}
if ($val==233){$car='%e9';}
if ($val==234){$car='%ea';}
if ($val==235){$car='%eb';}
if ($val==238){$car='%ee';}
if ($val==239){$car='%ef';}
if ($val==241){$car='%f1';}
if ($val==244){$car='%f4';}
if ($val==246){$car='%f6';}
if ($val==249){$car='%f9';}
if ($val==251){$car='%fb';}
if ($val==252){$car='%fc';}
$retour.=$car;
}
return($retour);
}

$flpth = accent($fullpath);
$faile = accent($file);
$this->listFiles[$tmp2]='<td>['.$flpth.'/'.$faile.' '.$file.']<td>';


Et voilà, ça doit marcher!!
Euhh par contre, pour mon site, j'ai supprimé l'option qui montre la taille des fichiers et j'ai la flemme de la remettre dans mon code, mais en respectant la ponctuation vous n'aurez pas de mal à la rétablir je pense!


PS pour Vedder: ton problème d'espace vient de ce qu'en php, tu peux te permettre d'écrire:
echo '<td width=250>'; à la place de
echo '<width="250">';
mais pas :
echo ''; à la place de
echo '';
D'où la rectification des guillemets dans mon code.
Si vous vous demandez à quoi sert ma fonction "accent", enlevez-là vous verrez ;^)

Bonne prog à tous :)
Evan
Afficher les 14 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.