Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

Catégorie :Fichier / Disque Niveau : Expert Date de création : 28/05/2002 Date de mise à jour : 28/05/2002 16:56:12 Vu : 18 230

Note :
7 / 10 - par 2 personnes
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

Description

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

  • <?
  • 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);
  • }
  • ?>
<?
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  :)
 

Commentaires et avis

signaler à un administrateur
Commentaire de OriOn le 29/05/2002 08:21:00 administrateur CS

La prochaine fois évite de cliquer plusieurs fois sur le bouton de submit pour mettre ta source....

signaler à un administrateur
Commentaire de Vapula le 29/05/2002 09:20:35

J'ai eu un pb sur ce site hier, c'est pour ca que la source y etait 3 fois ;))

signaler à un administrateur
Commentaire de pi0up51 le 29/05/2002 09:43:09

good good ;)

signaler à un administrateur
Commentaire de Stan le 05/11/2002 08:23:13


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'] ;

signaler à un administrateur
Commentaire de thedentiste le 03/02/2003 12:00:42

Plus simple encore
avec serveur unix
exec("find path -type f -exec basename {} ;",$list);

signaler à un administrateur
Commentaire de dpitard le 11/04/2003 23:40:00

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).

&lt;?
# 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);
}
?&gt;

signaler à un administrateur
Commentaire de aze555666 le 01/10/2004 20:52:51

pour un listage de répertoire, voir aussi code.aspx?id=24147: le code est plus court.

signaler à un administrateur
Commentaire de CyberDenix le 07/12/2006 21:16:06

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;
  }
}

--------------------------------------------

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,63 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.