Lister le contenu d'un dossier (avec spécification)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 23 335 fois - Téléchargée 31 fois

Contenu du snippet

La fonction sert à lister spécifiquement le contenu d'un repertoire en utilisant les extensions.
all (ou rien de spécifier) : liste tous les fichiers et dossiers
fichier : liste tous les fichiers
dossier : liste tous les dossiers
"extension" : liste tous les fichiers contenant l'extension entrée (sans le point)

Source / Exemple :


<?
function listRep ($repertoire, $typefichier){

  //Initialisation des variables
  $result;       //tableau de resultat
  $cptdossier=0; //cpt pour le tab des dossiers
  $cptfichier=0; //cpt pour le tab des fichiers
  $tab_fichier;  //tableau de fichiers
  $tab_dossier;  //tableau des dossiers
  $estfichier;   //booleen pour savoir si c'est un fichier
  $estdossier;   //booleen pour savoir si c'est un dossier

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

  //ouverture du dossier
  $handle=opendir('.');

  //lecture du dossier
  while ($fichier = readdir($handle)){
    if ($fichier != "." && $fichier != ".."){
      //Determination du type
      $estfichier = is_file($repertoire.$fichier);
      $estdossier = is_dir($repertoire.$fichier);

      //recup des éléments dans les tableaux respectifs
      if ($estdossier==true){
        $tab_dossier[$cptdossier] = $fichier;
        $cptdossier++;
        next;
      }
      if ($estfichier==true){
        $tab_fichier[$cptfichier] = $fichier;
        $cptfichier++;
        next;
      }
    }
  }
  //mise en place des resultats
    // si dossier
  if ($typefichier=="dossier"){
    $result = $tab_dossier;
  }
    //si fichier
  if ($typefichier=="fichier"){
    $result = $tab_fichier;
  }
    //tous les types
  if (($typefichier=="all")||($typefichier=="")){
    for ($i=0; $i<$cptdossier+1; $i++){
      $result[$i] = $tab_dossier[$i];
    }
    for ($j=0; $j<$cptfichier+1; $j++){
      $i = $cptdossier+$j+2;
      $result[$i] = $tab_fichier[$j];
    }
  }else{
    //extension spécifiées
    $i=0;
    for ($j=0; $j<$cptfichier+1; $j++){
      $extension = explode(".", $tab_fichier[$j]);
      $valmax = count($extension)-1;
      if ($typefichier==$extension[$valmax]){
        $result[$i] = $tab_fichier[$j];
        $i++;
      }
    }
  }
  //fermeture du dossier
  closedir($handle);
  return ($result);
}
?>

Conclusion :


pas de bugs rencontré jusqu'à présent :)

A voir également

Ajouter un commentaire

Commentaires

CyberDenix
Messages postés
17
Date d'inscription
lundi 6 octobre 2003
Statut
Membre
Dernière intervention
24 décembre 2007
-
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
-
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
-
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
-
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
-
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'] ;

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.