LISTER LE CONTENU D'UN DOSSIER (AVEC SPÉCIFICATION)
cs_OriOn
Messages postés822Date d'inscriptionvendredi 25 mai 2001StatutModérateurDernière intervention 1 août 2014
-
29 mai 2002 à 08:21
CyberDenix
Messages postés17Date d'inscriptionlundi 6 octobre 2003StatutMembreDernière intervention24 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.
CyberDenix
Messages postés17Date d'inscriptionlundi 6 octobre 2003StatutMembreDernière intervention24 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és208Date d'inscriptionmardi 13 avril 2004StatutMembreDernière intervention26 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és11Date d'inscriptionmercredi 9 avril 2003StatutMembreDerniè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és6Date d'inscriptiondimanche 20 mai 2001StatutMembreDernière intervention20 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és7Date d'inscriptionsamedi 11 août 2001StatutMembreDerniè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)
7 déc. 2006 à 21:16
Parce que glob, c'est glop :)
--------------------------------------------
$array = glob("./classes/*.php");
if ($array)
{
foreach ($array as $iterator) {
//do something here;
}
}
--------------------------------------------
1 oct. 2004 à 20:52
11 avril 2003 à 23:40
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);
}
?>
3 févr. 2003 à 12:00
avec serveur unix
exec("find path -type f -exec basename {} ;",$list);
5 nov. 2002 à 08:23
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'] ;
29 mai 2002 à 09:43
29 mai 2002 à 09:20
29 mai 2002 à 08:21