Coincé coincé! recherche de fichier dans des dossiers

Coincé coincé! recherche de fichier dans des dossiers - PHP - Programmation

Marsh Posté le 21-11-2007 à 16:47:23    

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
Reply

Marsh Posté le 21-11-2007 à 16:47:23   

Reply

Marsh Posté le 21-11-2007 à 17:31:19    

La recursion est la solution je pense ;)


---------------
We deserve everything that's coming...
Reply

Marsh Posté le 21-11-2007 à 19:14:41    

c quoi la récurtion??


---------------
http://www.free-tribes.org
Reply

Marsh Posté le 21-11-2007 à 19:55:42    

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...
Reply

Marsh Posté le 21-11-2007 à 20:26:39    

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
Reply

Marsh Posté le 21-11-2007 à 20:29:11    

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
Reply

Marsh Posté le 21-11-2007 à 20:59:39    

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...
Reply

Marsh Posté le 21-11-2007 à 22:04:06    

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
Reply

Marsh Posté le 22-11-2007 à 00:27:19    

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...
Reply

Marsh Posté le 22-11-2007 à 13:13:45    

c modifier et integré!


---------------
http://www.free-tribes.org
Reply

Marsh Posté le 22-11-2007 à 13:13:45   

Reply

Marsh Posté le 04-12-2007 à 21:56:14    

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
Reply

Marsh Posté le 04-12-2007 à 22:09:25    

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...
Reply

Marsh Posté le 04-12-2007 à 22:22:23    

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
Reply

Marsh Posté le 04-12-2007 à 23:28:40    

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...
Reply

Marsh Posté le 05-12-2007 à 01:09:21    

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
Reply

Marsh Posté le 05-12-2007 à 08:06:02    

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...
Reply

Marsh Posté le 05-12-2007 à 14:04:10    

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
Reply

Marsh Posté le 05-12-2007 à 14:23:27    

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
Reply

Marsh Posté le 05-12-2007 à 16:26:11    

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
Reply

Marsh Posté le 05-12-2007 à 16:31:28    

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
Reply

Marsh Posté le 05-12-2007 à 19:09:46    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed