LISTER LE CONTENU D'UN DOSSIER (AVEC SPÉCIFICATION)

cs_OriOn Messages postés 822 Date d'inscription vendredi 25 mai 2001 Statut Modérateur Dernière intervention 1 août 2014 - 29 mai 2002 à 08:21
CyberDenix Messages postés 17 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 24 décembre 2007 - 7 déc. 2006 à 21:16
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/12923-lister-le-contenu-d-un-dossier-avec-specification

CyberDenix Messages postés 17 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 24 décembre 2007
7 déc. 2006 à 21:16
Moi ya une fonction que j'adore, c'est glob.
Parce que glob, c'est glop :)
--------------------------------------------

$array = glob("./classes/*.php");
if ($array)
{
foreach ($array as $iterator) {
//do something here;
}
}

--------------------------------------------
aze555666 Messages postés 208 Date d'inscription mardi 13 avril 2004 Statut Membre Dernière intervention 26 janvier 2009
1 oct. 2004 à 20:52
pour un listage de répertoire, voir aussi code.aspx?id=24147: le code est plus court.
dpitard Messages postés 11 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 3 mai 2003
11 avril 2003 à 23:40
chez moi, ça ne marche pas quand je tente d'accéder à un sous-répertoire.

Voici une version adaptatée qui fonctionne et qui me semble plus efficace (pour n fichier je ne fais que n itérations).

<?
# liste le contenu d'un répertoire
# $typefichier=all: liste tous les répertoires et les fichiers
# $typefichier=fichier: liste tous les fichiers
# $typefichier=dossier: liste tous les dossiers
#
function listRep ($repertoire, $typefichier){
//Initialisation des variables
$result; //tableau de resultat

//valeur all par défaut
if ($typefichier=="")
$typefichier="all";

// test si c'est un repertoire
if (!(is_dir($repertoire)))
die("Ce n'est pas un répertoire");

//ouverture du dossier
$handle=opendir($repertoire);

$i=0;
//lecture du dossier
while ($fichier = readdir($handle)){
if ($fichier != "." && $fichier != ".."){
if (is_dir($repertoire.$fichier) && ($typefichier=="all" || $typefichier=="dossier")){
$result[$i++] = $fichier;
}
elseif (is_file($repertoire.$fichier)){
$tmp = pathinfo($fichier) ;
$extension = $tmp['extension'] ;
if ($typefichier=="all" || $typefichier=="fichier" || $typefichier==$extension) {
$result[$i++] = $fichier;
}
}
}
}

//fermeture du dossier
closedir($handle);
return ($result);
}
?>
thedentiste Messages postés 6 Date d'inscription dimanche 20 mai 2001 Statut Membre Dernière intervention 20 octobre 2004
3 févr. 2003 à 12:00
Plus simple encore
avec serveur unix
exec("find path -type f -exec basename {} ;",$list);
cs_Stan Messages postés 7 Date d'inscription samedi 11 août 2001 Statut Membre Dernière intervention 7 novembre 2002
5 nov. 2002 à 08:23
Je te propose quelques optimisations. Ne prends pas mal ce que je vais dire, mais tu vas voir qu'on peut gagner un peu en taille du code et en temps d'execution.

Cordialement,


Stan.
--------------------
1) En une seule ligne... die($message) est fait pour ça ! ;-)

// test si c'est un repertoire
if (!(is_dir($repertoire))){
{
die("Ce n'est pas un repertoire");
}

--------------------
1) pas la peine de passer par des variables intermédiaires pour les tests... ils peuvent directement aller des les IF()
2) 'next' inutiles
3) is_dir/is_file renvoient TRUE ou FALSE; si tu testes is_dir($machin) TRUE et que is_dir($machin) renvoie TRUE, ton test revient à demander si TRUE TRUE (donc inutile) : tu fais juste un IF(is_dir($machin))
Si tu veux vraiment passer par une variable intermédiaire, tu fais
$temporaire = is_dir($machin) ;
IF($temporaire) ...
4) tu peux incrémenter ton compteur directement dans le passage en index du tableau... et hop, une ligne de gagnée !

//lecture du dossier
while ($fichier = readdir($handle))
{
if ($fichier != "." && $fichier != "..")
{
//recup des éléments dans les tableaux respectifs
if (is_dir($repertoire.$fichier))
{
$tab_dossier[$cptdossier++] = $fichier;
}
if (is_file($repertoire.$fichier))
{
$tab_fichier[$cptfichier++] = $fichier;
}
} // fin while

--------------------
1) Tu peux renvoyer directement le resultat depuis ce test et sortir de ta fonction (ça évite tous les tests suivants qui font perdre du temps d'execution et qui seront de toutes façon FAUX ;-))

//mise en place des resultats
// si dossier
if ($typefichier=="dossier")
{
RETURN $tab_dossier ;
}
//si fichier
if ($typefichier=="fichier")
{
RETURN $tab_fichier ;
}

--------------------
1) Pour l'extension, y'a encore plus simple : PHP a prévu une fonction native 'pathinfo($fichier)' qui renvoie un tableau associatif dont l'index 'extension' contient l'extension de $fichier (donc plus rapide, surtout si il y a beaucoup de fichiers dans ton répertoire)

$tableau = pathinfo($file) ;
$extension = $tableau['extension'] ;
pi0up51 Messages postés 103 Date d'inscription vendredi 13 juillet 2001 Statut Membre Dernière intervention 26 août 2003
29 mai 2002 à 09:43
good good ;)
Vapula Messages postés 83 Date d'inscription mardi 9 avril 2002 Statut Membre Dernière intervention 17 mai 2005
29 mai 2002 à 09:20
J'ai eu un pb sur ce site hier, c'est pour ca que la source y etait 3 fois ;))
cs_OriOn Messages postés 822 Date d'inscription vendredi 25 mai 2001 Statut Modérateur Dernière intervention 1 août 2014
29 mai 2002 à 08:21
La prochaine fois évite de cliquer plusieurs fois sur le bouton de submit pour mettre ta source....
Rejoignez-nous