Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1463 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Coincé coincé! recherche de fichier dans des dossiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Coincé coincé! recherche de fichier dans des dossiers

n°1646671
GostSn
Lé Ou L'ApéRo?
Posté le 21-11-2007 à 16:47:23  profilanswer
 

Re salut a tous^^
 
bon ça fait deux jours que je tourne en rond donc voila je me décide a demander votre aide sur un script.
 
le but est de rechercher certain fichier dans des dossiers et sous dossier
 
je balance mon code
 

Code :
  1. $search=$_GET['mot'];
  2. $snrep=$_GET['snrep'];
  3. $findme   = $search;
  4. $rep = $snrep;
  5. $dir = opendir($rep);
  6. $dirdir=0;
  7. include('search_mod.php');


 
voici "search_mod.php":

Code :
  1. while ($f = readdir($dir)) {
  2.     if(is_dir($rep.$f) && $f != '..' && $f != '.') {
  3. //!--------------------------------------------------------------------DOSSIERS--lecture des dossiers---------------------------------------------------------------!//
  4.  $mystring = $f;
  5.  $pos = strpos($mystring, $findme);
  6.  if ($pos === false) {
  7.  }
  8.  else {
  9.       echo $findme.' a été trouvée ici=> <a href="1.php?snrep='.$snrep.$mystring.'/">'.$mystring.'</a><i>[REP]</i><br>';
  10.   $dirdir=$dirdir+1;
  11.  }
  12.  echo $dirdir.'<br>';
  13.  $ancien_dir=$dir;
  14.  $dir=$snrep.$mystring.'/';
  15.  $dir = opendir($dir);
  16.  $rep_ancien=$rep;
  17.  $rep=$snrep.$mystring.'/';
  18.  $snrep_ancien=$snrep;
  19.  $snrep=$snrep.$mystring.'/';
  20.  if ($mystring != NULL) {
  21.  include('search_mod.php'); //search_mod.php est le nom de ce script
  22.  }
  23.  $dirdir=$dirdir-1;
  24.  $dir=$ancien_dir;
  25.  $rep=$rep_ancien;
  26.  $snrep=$snrep_ancien;
  27. }
  28. //!-----------------------------------------------------------------FICHIERS----------lecture des fichiers---------------------------------------------------!//
  29.     $mystring = $f;
  30. $pos = strpos($mystring, $findme);
  31. if(is_file($rep.$f) && $f != '..' && $f != '.') {
  32.  if ($pos === false) {
  33.  }
  34.  else {
  35.       echo $findme.' a été trouvée ici=> <a href="play.php?id='.$mystring.'&snrep='.$snrep.'">'.$mystring.'</a><br>';
  36.  }
  37. }
  38. //!------------------------------------------------------------------------------------------------------------------------------------------------------!//
  39. }
  40. closedir($dir);


 
 
Voila, le script liste tous les fichiers contenant '$search' dans le dossier '$snrep'.
le probleme c'est que le script lit tout en montant jusqu'au dossier le plus haut, mais ne redéscend que d'un seule niveaux a chaque foi!
 
le pb doit ce trouver ici =>

Code :
  1. $snrep=$snrep_ancien


donc j'ai essayer plusieur méthode mais plus d'idée, la je suis vraiment coincer...
 
merci de votre aide


Message édité par GostSn le 04-12-2007 à 21:56:35

---------------
http://www.free-tribes.org
mood
Publicité
Posté le 21-11-2007 à 16:47:23  profilanswer
 

n°1646705
SICKofitAL​L
misanthrope
Posté le 21-11-2007 à 17:31:19  profilanswer
 

La recursion est la solution je pense ;)


---------------
We deserve everything that's coming...
n°1646755
GostSn
Lé Ou L'ApéRo?
Posté le 21-11-2007 à 19:14:41  profilanswer
 

c quoi la récurtion??


---------------
http://www.free-tribes.org
n°1646768
SICKofitAL​L
misanthrope
Posté le 21-11-2007 à 19:55:42  profilanswer
 

C'est lorsque une fonction s'appelle elle même :)
 
Exemple algorithmique : http://www.scriptol.org/fibonacci- [...] mation.php
 
Dans ton cas, il te faut la fonction qui parcours un dossier, et lorsqu'elle en trouve un, elle le parcous en s'appellant elle même.
 
Bien sûr, penses à mettre en place un systeme de sortie conditionnel, sinon c'est la boucle infinie ;)


---------------
We deserve everything that's coming...
n°1646779
GostSn
Lé Ou L'ApéRo?
Posté le 21-11-2007 à 20:26:39  profilanswer
 

ben la condition y est déja,
le script s'appel lui meme dès qu'il trouve un dossier


---------------
http://www.free-tribes.org
n°1646781
GostSn
Lé Ou L'ApéRo?
Posté le 21-11-2007 à 20:29:11  profilanswer
 

wais non j'ai regarder ta doc et le pb n'est pas la
hélas :s
il faudrais que je fasse déscendre le curseur dans le dossier parent une foi qu'il est arriver tout en haut...
 
le pb c'est que meme si je le fait redécendre il reprend la lecture dans le meme ordre, donc ouvre le meme dossier a chaque foi... (et ça une boucle..)
 
si quelqu'un as une autre idée...


---------------
http://www.free-tribes.org
n°1646793
SICKofitAL​L
misanthrope
Posté le 21-11-2007 à 20:59:39  profilanswer
 

mmmh je sais pas si j'ai été clair.
Mate ca (c un vieux code mais bon) :

Code :
  1. function makeTree ($chemin, $ind)
  2.  {
  3.   $olddir = getcwd ();
  4.   if (!@chdir ($chemin))
  5.    die ("cannot chdir to : " . $chemin);
  6.   // par défaut le tri est par ordre alphanum
  7.   $files = glob ("*" );
  8.   $flist = array ();
  9.   if ($files)
  10.   {
  11.    foreach ($files as $filename)
  12.    {
  13.     if (is_dir ($filename))
  14.     {
  15.      $t['isdir'] = true;
  16.      $t['name'] = $filename;
  17.      $t['subtree'] = makeTree ($filename, $ind + 1);
  18.      $t['size'] = count ($t['subtree']);
  19.     }
  20.     else
  21.     {
  22.      $t['isdir'] = false;
  23.      $t['name'] = $filename;
  24.      $t['size'] = filesize ("$filename" );
  25.      $t['subtree'] = null;
  26.      $t['parentdir'] = null;
  27.     }
  28.     $t['ind'] = $ind;
  29.     $flist[] = $t;
  30.    }
  31.   }
  32.   unset ($files);
  33.   unset ($t);
  34.   chdir ($olddir);
  35.   return $flist;
  36.  }


 
La fonction s'appelle "$tree = makeTree ("TON CHEMIN", 0);" et ca te renvois un tableau contenant toute l'arborescence (fichier et sous dossier) à partir de de "TON CHEMIN".
 
Fait un print_r ($tree) pour voir le résultat.
Adaptes le à ta guise :)


---------------
We deserve everything that's coming...
n°1646842
GostSn
Lé Ou L'ApéRo?
Posté le 21-11-2007 à 22:04:06  profilanswer
 

c clair qu'il as l'ai bocoup plus simple ce script :)
je l'est tester ça fonctionne!
 
domage pour mon script! mais la j'en ai trop marre je vais choisir la facilitée^^
 
merci bien!


---------------
http://www.free-tribes.org
n°1646940
SICKofitAL​L
misanthrope
Posté le 22-11-2007 à 00:27:19  profilanswer
 

pas de soucis, si je devais le refaire maintenant je sais pas si je ferais comme ca mais bon ...
donc hésites pas à le modifier à ta guise :hello:


---------------
We deserve everything that's coming...
n°1647148
GostSn
Lé Ou L'ApéRo?
Posté le 22-11-2007 à 13:13:45  profilanswer
 

c modifier et integré!


---------------
http://www.free-tribes.org
mood
Publicité
Posté le 22-11-2007 à 13:13:45  profilanswer
 

n°1652946
GostSn
Lé Ou L'ApéRo?
Posté le 04-12-2007 à 21:56:14  profilanswer
 

SICKofitALL a écrit :

mmmh je sais pas si j'ai été clair.
Mate ca (c un vieux code mais bon) :

Code :
  1. function makeTree ($chemin, $ind)
  2.  {
  3.   $olddir = getcwd ();
  4.   if (!@chdir ($chemin))
  5.    die ("cannot chdir to : " . $chemin);
  6.   // par défaut le tri est par ordre alphanum
  7.   $files = glob ("*" );
  8.   $flist = array ();
  9.   if ($files)
  10.   {
  11.    foreach ($files as $filename)
  12.    {
  13.     if (is_dir ($filename))
  14.     {
  15.      $t['isdir'] = true;
  16.      $t['name'] = $filename;
  17.      $t['subtree'] = makeTree ($filename, $ind + 1);
  18.      $t['size'] = count ($t['subtree']);
  19.     }
  20.     else
  21.     {
  22.      $t['isdir'] = false;
  23.      $t['name'] = $filename;
  24.      $t['size'] = filesize ("$filename" );
  25.      $t['subtree'] = null;
  26.      $t['parentdir'] = null;
  27.     }
  28.     $t['ind'] = $ind;
  29.     $flist[] = $t;
  30.    }
  31.   }
  32.   unset ($files);
  33.   unset ($t);
  34.   chdir ($olddir);
  35.   return $flist;
  36.  }


 
La fonction s'appelle "$tree = makeTree ("TON CHEMIN", 0);" et ca te renvois un tableau contenant toute l'arborescence (fichier et sous dossier) à partir de de "TON CHEMIN".
 
Fait un print_r ($tree) pour voir le résultat.
Adaptes le à ta guise :)


 
heu oui, je l'avais modifier,
mais maintenent j'ai besoin vraiment de savoir commence ça marche ses foutu tableaux!
 
par exemple comment renvoyer juste les nom de fichier trouver genre (comme avec un echo):
 
-fichier1
-fichier2
-fichier0
 
et faire :
 
-fichier1 72k
-fichier2 30k
 
etc..
 
et surtout savoir comment les trier par taille.
 
Si vous avez des exemple sous la main je serais super heureux...
J'aprend beaucoup par des exemple!
 
merci d'avance a tous!


---------------
http://www.free-tribes.org
n°1652955
SICKofitAL​L
misanthrope
Posté le 04-12-2007 à 22:09:25  profilanswer
 

Ecoute comme dit, tu fais un print_r du tableau retourné et tu as la structure et les infos que tu veux.
A toi ensuite de choper ce quil te faut, exporter ca dans un autre tableau de ton cru, que tu pourras organiser à gros coup de fonction  "sort" ;)
 
sinon en gros :
si c un dossier :
  'isdir' est à vrai (TRUE)
  'name' est le nom du dossier;
  'subtree' pointe vers une autre structure identique contenant un sous-dossier
  'size' est le nombre d'éléments dans ce dossier (sous-dossiers + fichiers)
 
si c'est un fichier :
'isdir' est à FALSE
'name' est le nom du fichier
'size' sa taille en octets
'subtree' est à NULL car il pointe forcément pas vers un sous-dossier
'parentdir' est à null aussi (mais là je constate un bug, il devrait pointer vers le dossier parent et se trouver géré dans le cas des dossiers ;) )
 
Voilà, il te suffit d'itérer tt ca, avec des foreach par exemple, et pourkoi pas avec des fonctions récursives ;)


---------------
We deserve everything that's coming...
n°1652962
GostSn
Lé Ou L'ApéRo?
Posté le 04-12-2007 à 22:22:23  profilanswer
 

mais si je fait "echo $tree['size']"
ça ne me retourne rien!
 
je suis perdu là :s
 
vous avez pas un bout de code que je puisse modifier afin de le comprendre?
 
Genre par exemple tu ferrais comment pour afficher la liste des fichier par poid?
 
J'ai regarder la doc php mais j'y comprend rien!
 
Les seuls tableaux (si ça en ai) que je comprend sont les tableaux que je fait avec explode()!
 
donc merci d'avance d'éclaire ma lenterne :)


---------------
http://www.free-tribes.org
n°1653000
SICKofitAL​L
misanthrope
Posté le 04-12-2007 à 23:28:40  profilanswer
 

mais je m'exprime mal ou koi  ??? :D
 
Bon reprenons...  
Supposons que tu souhaite parcourir cette structure de dossiers (sous windows) :
c:\monDossier
  +sous-dossier1
    fichierAA
    fichierBB
  fichierA
  fichierB
 
Pour afficher le résultat, tu utilises ca :

Code :
  1. print ("<pre>" ); // pour la mise en forme
  2. print_r ($tree);
  3. print ("</pre>" );


ce qui va te donner :

Code :
  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.             [isdir] =>
  6.             [name] => fichierA
  7.             [size] => 0
  8.             [subtree] =>
  9.             [parentdir] =>
  10.             [ind] => 0
  11.         )
  12.     [1] => Array
  13.         (
  14.             [isdir] =>
  15.             [name] => fichierB
  16.             [size] => 0
  17.             [subtree] =>
  18.             [parentdir] =>
  19.             [ind] => 0
  20.         )
  21.     [2] => Array
  22.         (
  23.             [isdir] => 1
  24.             [name] => sous-dossier1
  25.             [size] => 2
  26.             [subtree] => Array
  27.                 (
  28.                     [0] => Array
  29.                         (
  30.                             [isdir] =>
  31.                             [name] => fichierAA
  32.                             [size] => 0
  33.                             [subtree] =>
  34.                             [parentdir] =>
  35.                             [ind] => 1
  36.                         )
  37.                     [1] => Array
  38.                         (
  39.                             [isdir] =>
  40.                             [name] => fichierBB
  41.                             [size] => 0
  42.                             [subtree] =>
  43.                             [parentdir] =>
  44.                             [ind] => 1
  45.                         )
  46.                 )
  47.             [parentdir] =>
  48.             [ind] => 0
  49.         )
  50. )


 
Tu veux afficher le nombre d'éléments (fichiers + dossiers) trouvés à la racine de ce dossier ?

Code :
  1. print (count ($tree));


 
Tu veux simplement boucler sur ceux-là et afficher leur nom, et aussi la taille qui va avec ?

Code :
  1. for ($i = 0; $i < count ($tree); $i++)
  2.   print ("nom : " . $tree[$i]['name'] . " - taille : " . $tree[$i]['size']);


 
Tu remarqueras ici que pour "sous-dossier1" il t'affiche 2, car c le nombre d'éléments contenus dans ce sous-dossier, à toi donc de vérifier si tu ne veux afficher QUE les fichiers et leurs taille respectives, que $tree[INDEX]['isdir'] est à FALSE.
 
Si il est TRUE (à 1 si tu veux), tu peux appeler une fonction (récursive) qui affiche branche par branche, avec en parametres une branche justement de "l'arbre", par exemple :

Code :
  1. function affBranche ($branche)
  2. {
  3.   for ($i = 0; $i < count ($branche); $i++)
  4.   {
  5.     if ($branche[$i]['isdir'])
  6. {
  7.       print ("Nom de cette sous-branche :" . $branche[$i]['name'] . "<br>" );
  8.       affBranche ($branche[$i]['subtree']);
  9. }
  10.     else
  11.       print ("nom : " . $branche[$i]['name'] . "<br>" );
  12.   }
  13. }
  14. affbranche ($tree);


 
Ce qiu te donneras ca :
nom : fichierA
nom : fichierB
nom de cette sous-branche :sous-dossier1
nom : fichierAA
nom : fichierBB
 
J'espère avoir été plus clair ;)


---------------
We deserve everything that's coming...
n°1653027
GostSn
Lé Ou L'ApéRo?
Posté le 05-12-2007 à 01:09:21  profilanswer
 

Non tu t'exprime super bien,
grace à toi j'aurrais compris les "fonctions (récursive)" et une partie pour les tableaux.
c'est moi qui est un peut du mal a m'exprimer dans un domaine ou j'ai du mal..
 
J'ai modifier la function "affBranche ($branche)" pour avoir juste une liste de fichier de type:
nom : fichierA
nom : fichierB
nom : fichierAA
nom : fichierBB  
 
plus la taille^^
 
mais je voudrais savoir comment faire en sorte que ses fichiers soit trier par taille? du plus lourd au moins lourd?
cad:
 
nom : fichierA taille 1k
nom : fichierBB taille 2k
nom : fichierAA taille 2,2k
nom : fichierB  taille 2,24k


---------------
http://www.free-tribes.org
n°1653054
SICKofitAL​L
misanthrope
Posté le 05-12-2007 à 08:06:02  profilanswer
 

Dans la fonction affBranche que tu as modifiée, au lieu d'afficher le nom des fichiers, place le résultat dans un autre tableau.  
Ensuite tri le avec la fonction asort.
 
De toute facon tu n'as vraiment le choix, tu dois d'abord parcourir tes dossiers, et seulement après travailler le résultat :)
 
En fait, regarde du coté des fonctions PHP de tri, certaines te permettent de conserver la structure de ton tableau et de trier par une clé dans celui-ci, ainsi, tu pourras utiliser par exemple un tableau de tri temporaire du style : temp[INDEX][ ['NOM']['TAILLE'] ]
:hello:


---------------
We deserve everything that's coming...
n°1653255
GostSn
Lé Ou L'ApéRo?
Posté le 05-12-2007 à 14:04:10  profilanswer
 

SICKofitALL a écrit :

Dans la fonction affBranche que tu as modifiée, au lieu d'afficher le nom des fichiers, place le résultat dans un autre tableau.  
Ensuite tri le avec la fonction asort.
 
De toute facon tu n'as vraiment le choix, tu dois d'abord parcourir tes dossiers, et seulement après travailler le résultat :)
 
En fait, regarde du coté des fonctions PHP de tri, certaines te permettent de conserver la structure de ton tableau et de trier par une clé dans celui-ci, ainsi, tu pourras utiliser par exemple un tableau de tri temporaire du style : temp[INDEX][ ['NOM']['TAILLE'] ]
:hello:


 
Merci pour ta précieuse aide!
 
donc j'ai modifier la fonction comme ça:
 

Code :
  1. function affBranche ($branche)
  2.    {
  3.     $temp=array ();
  4.      for ($i = 0; $i < count ($branche); $i++)
  5.      {
  6.        if ($branche[$i]['isdir'])
  7.    {
  8.          affBranche ($branche[$i]['subtree']);
  9.    }
  10.       else
  11.          $temp['nom']=$branche[$i]['name'];
  12.          $temp['taille']=$branche[$i]['size'];
  13.     }
  14.     return $temp;
  15.   }
  16.  
  17.   $temp[]=affbranche ($tree);
  18.  
  19.   print_r($temp);


 
ça me place qu'un seul fichier trouver dans le tableau lol
 
Je te remerci de ta patience^^
De fil en aiguille je me retrouve dans un domaine que je ne conaissait pas du tout. surtout les fonctions perso et les tableaux... et je ne sais pas comment demander ça à google...
 
je suis persuader que c'est le return() de la fonction qui foire non?
 
Merci Merci d'avance!


---------------
http://www.free-tribes.org
n°1653269
GostSn
Lé Ou L'ApéRo?
Posté le 05-12-2007 à 14:23:27  profilanswer
 

Code :
  1. function affBranche ($branche)
  2.    {
  3.     $temp2=array ();
  4.      for ($i = 0; $i < count ($branche); $i++)
  5.      {
  6.        if ($branche[$i]['isdir'])
  7.    {
  8.          //print ("Nom de cette sous-branche :" . $branche[$i]['name'] . "<br>" );
  9.          affBranche ($branche[$i]['subtree']);
  10.    }
  11.       else {
  12.         print ("nom : " . $branche[$i]['name'] .' taille: '.$branche[$i]['size']. "<br>" );
  13.  
  14.      }
  15.          $temp2[$branche[$i]['name']]=$branche[$i]['size'];
  16.     }
  17.     unset ($temp);
  18.     return $temp2;
  19.   }
  20.  
  21.   $temp=affbranche ($tree);
  22.  
  23.   print ("<pre>" );
  24.   @print_r($temp);
  25.   print ("</pre>" );


EDIT:
je vien de le modifier comme ça mais ça me retourne que le premier dossier...


Message édité par GostSn le 05-12-2007 à 15:02:37

---------------
http://www.free-tribes.org
n°1653394
GostSn
Lé Ou L'ApéRo?
Posté le 05-12-2007 à 16:26:11  profilanswer
 

Code :
  1. function affBranche ($branche,$temp2)
  2.    {
  3.      for ($i = 0; $i < count ($branche); $i++)
  4.      {
  5.       $temp2[$branche[$i]['name']]=$branche[$i]['size'];
  6.  
  7.        if ($branche[$i]['isdir'])
  8.    {
  9.          affBranche ($branche[$i]['subtree'],$temp2);
  10.    }
  11.       else {
  12.      }
  13.     }
  14.     return ($temp2);
  15.   }
  16.  
  17.   $temp=affbranche ($tree,array ());
  18.  
  19.   print ("<pre>" );
  20.   @print_r($temp);
  21.   print ("</pre>" );


Le seule truc que j'ai compris c'est que à chaques boucle le tableaux reprend a zéro! :pt1cable:  
il doit surement il avoir un truc que j'ai zapper :heink:

Message cité 1 fois
Message édité par GostSn le 05-12-2007 à 16:26:54

---------------
http://www.free-tribes.org
n°1653395
omega2
Posté le 05-12-2007 à 16:31:28  profilanswer
 

GostSn a écrit :

Citation :


    function affBranche ($branche,$temp2)
    {
      for ($i = 0; $i < count ($branche); $i++)
      {
   $temp2[$branche[$i]['name']]=$branche[$i]['size'];
 
        if ($branche[$i]['isdir'])
    {
          affBranche ($branche[$i]['subtree'],$temp2);
    }
       else {
  }
     }
 return ($temp2);
   }
   
   $temp=affbranche ($tree,array ());
   
   print ("<pre>" );
   @print_r($temp);
   print ("</pre>" );


Le seule truc que j'ai compris c'est que à chaques boucle le tableaux reprend a zéro! :pt1cable:  
il doit surement il avoir un truc que j'ai zapper :heink:

Je crois que l'erreur est dans la première ligne noire.
En gros, il faut que tu considères une fonction récursive comme étant une infinité de fonctions identiques. A chaque fois que la fonction s'appelle, une nouvelle copie avec ses propres variables se met à exister : il n'y a pas de partage inné de variable (que des partages acquis par les paramètres et le return) entre deux appels de la fonction.
Du coup, comme tu ne récupères jamais ce que te retourne la fonction, c'est comme si tu ne l'appellais jamais.
 
EDIT : J'ai simplement quoter ton code pour pouvoir mettre en gras ton erreur. ;)


Message édité par omega2 le 05-12-2007 à 16:32:49
n°1653480
GostSn
Lé Ou L'ApéRo?
Posté le 05-12-2007 à 19:09:46  profilanswer
 

affBranche ($branche[$i]['subtree'],$temp2);  
rapelle la fonction en fesant suivre la variable $temp2
elle sert a regarder dans les dossier d'un répertoire.(je parle de l'apel de la fonction dans la fonction :pt1cable: )
 
le return serrait pour la derniere valeur de $temp2 qui ai un tableau.
ça marche mais on dirais que au bout d'un moment le tableaux repart à zéro..
c'est ça que je ne comprend pas


Message édité par GostSn le 05-12-2007 à 19:10:59

---------------
http://www.free-tribes.org
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Coincé coincé! recherche de fichier dans des dossiers

 

Sujets relatifs
Restreindre l'accès aux sous dossierscharger decharger fichier SWF
XSLT - Transformation d'un fichier XMLTester /récupérer date de derniere modif fichier
script recherche mot et liste document les contenantsLire un tableau de valeurs dans un fichier contenant aussi du texte
[Fichier TXT] ajouter un caractère à la fin de chaque ligneImporter fichier Excel dans Outlook
[PHP] Upload de fichier en plusieurs parties[ FLASH ] Qu'est ce qu'un fichier MXP ?
Plus de sujets relatifs à : Coincé coincé! recherche de fichier dans des dossiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR