Test existence d'un fichier

Fermé
Utilisateur anonyme - 8 déc. 2009 à 10:03
 Utilisateur anonyme - 10 déc. 2009 à 16:50
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.
A voir également:

3 réponses

Archeus01 Messages postés 1567 Date d'inscription mercredi 3 octobre 2007 Statut Membre Dernière intervention 9 juin 2022 447
8 déc. 2009 à 16:38
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
Utilisateur anonyme
9 déc. 2009 à 22:03
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
Utilisateur anonyme
10 déc. 2009 à 16:50
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