Test existence d'un fichier

Bonjour,

J'ai une fonction récursive, qui se charge de lister des fichiers selon leur extension dans un répertoire et ses sous-répertoires, et je voudrais que le nom du répertoire ne soit affiché que s'il contient au moins un fichier portant l'extension souhaitée.

Ppour l'instant, j'en suis là
<?php
function listing($dir) {
   $dh = opendir($dir);
   if($dh) {
      while (false !== ($file = readdir($dh))) {
         if(is_file($dir.$file) && stristr($dir.$file, '.gz')) {
            echo '<a href="'.preg_replace('/usr\/share\//', '', $dir).$file.'">'.$file.'</a><br />';
         } elseif(is_dir($dir.$file) && $file!=".." && $file!="." ) {
              $gzfile = $dir.$file."/*.gz"; 
// là, ça coince : la condition n'est jamais vérifiée
              if (file_exists($gzfile)) {
                 echo preg_replace('/usr\/share\/doc\//', '', $dir).$file.'<br>';
              }
              $new_dir=realpath($dir.$file);
              listing("$new_dir/");
         }
      }
      closedir($dh);
   }
}

listing("/usr/share/doc/");///Utilisation de la fonction (on part de la racine du répertoire)

?>


Il y a peut-être d'autres choses à améliorer; je prend tout ^^

par avance, merci.
Configuration: Debian GNU/Linux Stable

3 réponses

  1. Bonjour,
    Du code de haut vol non commenté... Beau casse tête.

    Donc ce que je vais dire est peut-être faux mais ton $gzfile = $dir.$file."/*.gz"; doit TOUJOURS être null non? Parce que sinon, on est pas dans le elseif mais bien dans le if contenant le premier echo ...
    0
    1. si je remplace *.gz par un nom de fichier qui existe dans le répertoire, ça fonctionne...

      le problème c'est cette pseudo-regex

      J'ai l'impression que PHP interprète l'astérisque littéralement.
      Comment lui dire de considérer l'astérisque en tant que caractère générique?
      0
      1. J'ai avancé un peu, ça marche mieux avec quelques modifications
        elseif(is_dir($dir.$file) && ! is_link($dir.$file) && $file!=".." && $file!="." ) {
                      if (glob($dir.$file.'/*.gz')) {
                         echo preg_replace('/usr\/share\/doc\//', '', $dir).$file.'<br>';
                      }
                      $new_dir=realpath($dir.$file);
                      listing($new_dir.'/');
                 }
        

        mais ce n'est pas encore parfait. Par exemple, j'obtiens

        /iproute-doc/examples
        /iproute-doc/examples/diffserv

        Edge31-ca-u32.gz
        Edge32-cb-chains.gz
        Edge32-ca-u32.gz
        Edge32-cb-u32.gz
        ----------------------------------------------v-- ça fait partie de iproute-doc/examples
        dhcp-client-script.gz
        README.cbq.gz
        cbq.init-v0.7.3.gz
        ----------------------------------------------v-- ça fait partie de iproute-doc, qui est au-dessus et affiche d'autres fichiers
        arpd.dvi.gz
        api-ip6-flowlabels.tex.gz
        api-ip6-flowlabels.ps.gz
        arpd.txt.gz
        ip-cref.tex.gz
        ip-tunnels.tex.gz

        C'est donc encore un peu le bazar :(
        0

        Discussions similaires

        question pix mot caché

        7 réponses