Effectuer action tant qu'il y a des fichiers dans un repertoire [Résolu]

Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
- - Dernière réponse : payetonju
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
- 21 mai 2010 à 14:46
Bonjour,

Je voudrais effectuer un traitement en fonction du nombre de fichiers que je trouve dans un dossier.
Quand je cherche dans une BDD je fais

// connexion
$SQL "SELECT videos FROM fichiers WHERE extension 'FLV' ";
$RES = mysql_query( $SQL );
while( $data = mysql_fetch_assoc( $RES ) )
{
  // Mon traitement
  echo $data['video'];
}
//deconnexion


Mais quand je veux effectuer mon traitement avec "tant qu'il y a un fichier dans un repertoire" au lieu de "tant qu'il y a de resultat dans la BDD" jesuis bloqué.
Quelqu'un peut m'aider svp ? merci.
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
3
Merci
dans un foreach, il y a til possibilité de connaitre le nombre de résultats contenus dasn le tableau ?


Dans ce cas non, mais il y a plusieurs façons d'y remédier (bufferiser les résultats du foreach, ...)

(toutes ces fonctions similaires ne sont pas documentees dans PHP manual et php.net donc pour m'y retrouver c'est pas évident)

C'est clair, la SPL n'est vraiment pas bien documentée, et en plus il y a quelques bizarreries dans sa mise en oeuvre (selon moi bien sur)


Si j'ai bien compris cet exemple ci-dessus, tu check si c'est un dossier si c'est le cas tu met chaque fichiers et dossier trouvés dedans et tu traite chacun des ficheir grace au foreach ?


Oui, enfin, plus exactement :
tu instancies ton itérateur DirectoryIterator
tu itères sur chaque élément via la structure foreach
tu vérifies que l'entrée est un fichier ($entry->file())
tu fais ton traitement (ici un simple echo du nom du fichier)

Ci dessous un moyen de bufferiser :
<?php
$iterator = new DirectoryIterator('ton_dossier');

$buff = '';
$cnt = 0;

foreach ($iterator as $entry) {
if ($entry->isFile()) {
// traitement
$buff.= $entry.'
';
}
$cnt++;
}

echo 'nb de videos : '.$cnt.'
';
echo $buff;


?>


lol bah mon provider a l version 4.4.9 :(

Un conseil => change d'hébergeur !!!
Tu es chez qui ?

Normal que ça ne fonctionne pas donc.


Et je ne traiet pas les videos de la mem maniere car à uploader c'est beaucoup trop long je les enregistre manuellement.

En quoi cela t'empêche t il d'utiliser une DB ?
Tu peux très bien rentrer les infos en DB manuellement.
En plus ça te permet de mettre tout un tas d'autres infos : titre, description, lieu, catégorie, .... et donc de proposer un moteur de recherche, etc ... etc ...
Lire les noms des fichiers directement sur le système de fichiers est plus lent, ... entre autres.


Cordialement,

Kohntark -

Merci kohntark 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de kohntark
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
3
Merci
j'ecoute les pros, toi en l'occurrence :)

Je suis tout, tout, tout, tout, sauf un pro

Heureux d'avoir pu t'aider.


Une dernière pour la route; pour passer ton hébergement 1&1 de PHP4 à PHP 5

http://faq.1and1.fr/scripts/php/5.html


Bonne continuation,

Kohntark -

Merci kohntark 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de kohntark
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
0
Merci
Salut,

Tu peux te tourner vers la SPL avec RecursiveDirectoryIterator

Cordialement,


Kohntark -
Commenter la réponse de kohntark
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
hello kohntark !

RecursiveDirectoryIterator ça retourne le chemin et le nom de l'entrée courante du dossier, mais ce n'est pas vraiment ce que je souhaite faire, a moins que je n'ai pas compris à quoi sert cette fonction lol
Commenter la réponse de payetonju
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
0
Merci
Arf, ben j'ai peut être mal compris alors ^^

Si j'en crois ton exemple, j'imagine que tu souhaites faire un traitement sur chaque fichier trouvés, mais ne sachant pas exactement quelles données tu souhaites exploiter (nom de fichier, taille, date de modif, etc ...) je te proposais la SPL qui couvre une large partie de celles-ci.

Je pensais à un truc dans le genre :
<?php
$iterator = new DirectoryIterator('ton_dossier');

foreach ($iterator as $entry) {
    if ($entry->isFile()) {
    // traitement
        echo $entry.'
 ';
    }
}
?>


Ou, en récursif :
<?php

$dir ="ton_dossier";
$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($dir,RecursiveDirectoryIterator::KEY_AS_FILENAME)
);

foreach ($iterator as $entry) {
    // traitement
    echo $entry.'
 ';

}
?>


Ai je mal compris ?
Si c'est le cas peux tu apporter plus d'infos sur ce que tu veux faire.


Cordialement,


Kohntark -
Commenter la réponse de kohntark
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
Hello !

Bon en fait si tu avais bien compris, c'est moi qu ia pas compris ce que tu m'as mis lol ! tu viens de me faire découvrir de nouvelles fonctions alors je suis un peu perdu (a oui il m'en faut peu :) )

Ce que je souhaite :
j'ai un dossier "videos" contenant des fichiers flv, et je voudrais faire un affichage sur une page videobook.php de toutes les videos contenues dans ce dossier afin de pouvoir les lire en streaming.

J'utilise le meme principe pour les photos, mais les photos sont également enregitrées dans la BDD, donc pour chaque element de ma table je test avec un if(file_exists($file)) et le tour est joué ! Or là je galère un peu en traitant directement les fichiers lol

<?php
$iterator = new DirectoryIterator('ton_dossier');

foreach ($iterator as $entry) {
    if ($entry->isFile()) {
    // traitement
        echo $entry.'
 ';
    }
}
?>


Si j'ai bien compris cet exemple ci-dessus, tu check si c'est un dossier si c'est le cas tu met chaque fichiers et dossier trouvés dedans et tu traite chacun des ficheir grace au foreach ?

(toutes ces fonctions similaires ne sont pas documentees dans PHP manual et php.net donc pour m'y retrouver c'est pas évident)
Commenter la réponse de payetonju
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
et une auter petite question, dans un foreach, il y a til possibilité de connaitre le nombre de résultats contenus dasn le tableau ?
Ou il faut incrémenter une varaible pour chaque résultat lu ? ce qui n'est pas pratique si on veut mettre un truc du style "il y a X resultats trouves" car ça se retrouvera à la fin :/ et le count je dois pas marcher la je pense
Commenter la réponse de payetonju
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
haaa je suis désolé je t'enchaine lol
mais je ne dois peut etre pas avoir la libraire concernée ?

ça me met ceci :
Cannot instantiate non-existent class: directoryiterator

Alors qu'avec Wampserver en local ça fonctionne bien. c'est normal ?
Commenter la réponse de payetonju
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
0
Merci
Pourquoi ne traites tu pas les vidéos de la même façon que les photos ?
C'est tout de même bien plus logique de passer par une DB que de scanner un dossier (long, pas flexible, etc ...)

ça me met ceci :
Cannot instantiate non-existent class: directoryiterator

Alors qu'avec Wampserver en local ça fonctionne bien. c'est normal ?


Qu'elle est ta version de php ?
ne me dis pas que tu es encore en PHP 4


Kohntark -
Commenter la réponse de kohntark
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
lol bah mon provider a l version 4.4.9 :(

Et je ne traiet pas les videos de la mem maniere car à uploader c'est beaucoup trop long je les enregistre manuellement.

Deja une photo de 3Mo c'est long, alors j'imagine pas une video de 40Mo ^^ :/

C'est pourquoi j'essaye de trouver des solutions de secours
Commenter la réponse de payetonju
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
Je suis chez 1&1, mais les critiques que j'ai lues ne sont pas très bonnes.

Et, tu as raison, je pourrais très bien rentrer manuellement les infos des vidéos dans la BDD, déjà tout a lheure j'etais coincé en voulant mettre une description d'une vidéo (la rentrer en dur j'aime pas trop ^^). C'est con mais je n'y avais pas pensé !!

Sinon j'avais trouvé :
if( $handle = opendir( "..".$CheminVideos ) )
{
  while( false !( $file readdir($handle) ) )
  {
    if( $file != "." && $file != ".." )
    {
      echo "<center>Jujitsu : (Open National de Biarritz Octobre 2008 - 2e tour)

";
    Stream("../videos/".$file,"640","480",$ServerAdress,"DivTestStreaming");
      echo "</center>

\r\n";
    }
  }
  closedir( $handle );
}


et ça fonctionne bien, mais si niveau performance il vaut mieux passe par une BDD bah j'ecoute les pros, toi en l'occurrence :)

Merci du coup de main je pense pouvoir me débrouiller.
bon weekend kohntark @+
Commenter la réponse de payetonju
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
Encore un grand merci :)
me voila en php 5.2 :) trop bon !!!
Commenter la réponse de payetonju

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.