Listage répertoires/sous répertoires + fichiers

Soyez le premier à donner votre avis sur cette source.

Vue 10 190 fois - Téléchargée 849 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
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
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!?
Messages postés
1
Date d'inscription
vendredi 17 octobre 2003
Statut
Membre
Dernière intervention
5 juin 2005

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
Messages postés
1
Date d'inscription
samedi 11 novembre 2000
Statut
Membre
Dernière intervention
17 mars 2005

if (is_dir($path.'/'.$file) && $path.'/'.$file != "." && $path.'/'.$file != "..")

avec ca , un meilleur fonctionnement est visible avec des chemins unix,
et voilou :)
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
Hum ça marchera mieux si vous sortez la fonction de la boucle lol
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
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.