Aller au contenu

[PHP] recherche de fichiers avec le php


Jeep

Messages recommandés

Bonjour à tous,

Voilà je suis en stage de validation de fin d'études et l'on m'a demandé de faire une chose que je ne vois pas comment faire (help ! :pleure: ) (si jamais c faisable :pleure: ): j'ai un projet à programmer en php mais une chose me bloque : dans une partie de l'algorithme je dois aller chercher tous les fichiers éparpillés dans le disque dur qui commence par 4p**** et les renommer autrement.

Pour renommer pas de probleme. Par contre comment fait on pour faire une recherche de fichiers avec le php ?? :pleure:

Merci d'avance pour votre aide

Lien vers le commentaire
Partager sur d’autres sites

Récursivement à partir d'un répertoire de base...

function parcourir($repertoire)
{
 // on ouvre le répertoire
 $rep = opendir($repertoire);

 // pour chacun des fichiers dedans...
 while ( ($fichier = readdir($rep)) !== false)
 {
   // on ne prend pas les répertoires . et ..
   if ( ($fic == ".") || ($fic == "..") ) continue;

   // si c'est un répertoire, on recommence récursivement
   if ( is_dir($fic) ) parcourir($repertoire.'/'.$fic);

   // sinon c'est un fichier, et on regarde s'il commence par "4p"
   if (substr($fic,0,2) == "4p")
   {
     // ici tu fais ce que tu veux avec ton fichier... :)
   }
 }
}



Pour appeler la fonction, tu donnes simplement le répertoire racine :
parcourir ("/images");      (par exemple)

Voilà, j'ai tapé ça à la volée, il y a peut-être un ou deux bugs dedans :pleure: , mais ça devrait globalement être bon.

Tiens-nous au courant !

Lien vers le commentaire
Partager sur d’autres sites

oui oui pardon, j'ai légèrement changeé de nom de variable en plein milieu (bravo pour ton oeil de lynx théo ! :mdr:), honte à moi :mad2:

Mais bon comme je l'ai dit, j'ai tapé ça en live directement dans le forum, sans tester... Mais moyennant ce petit changement, ça devrait fonctionner.

Lien vers le commentaire
Partager sur d’autres sites

Merci pour votre précieuse aide. Mais c'est bizarre la partie récursive de la fonction n'a pas lair de bien fonctionner : ils trouvent bien tous les fichiers 4p dans le repertoire que j'ai spécifié, mais les fichiers contenus dans les sous dossiers du meme repertoire ne sont pas trouvés.

J'y travaille... Merci encore ! ;)

Lien vers le commentaire
Partager sur d’autres sites

J'ai trouvé ce qui n'allait pas.

C'est la fonction is_dir() qui demandait un chemin complet...

Voilà le nouveau code, il fonctionne chez moi ;)

function parcourir($repertoire)
{
 // on ouvre le répertoire
 $rep = opendir($repertoire);

 // pour chacun des fichiers dedans...
 while ( ($fic = readdir($rep)) !== false)
 {
   // on ne prend pas les répertoires . et ..
   if ( ($fic == ".") || ($fic == "..") ) continue;

   // si c'est un répertoire, on recommence récursivement
   if ( is_dir($repertoire.$fic) ) parcourir($repertoire.$fic);

    // sinon c'est un fichier
   else
   {
     // on regarde s'il commence par "4p"
     if (substr($fic,0,2) == "4p")
     {
       // ici tu fais ce que tu veux avec ton fichier... :)
       // le chemin complet de ton fichier est :   $repertoire.$fic
     }
   }
 }
}


Pour appeler la fonction, tu donnes simplement le répertoire racine :
parcourir ("/images/");      (par exemple)
// ATTENTION, NE PAS OUBLIER LE / A LA FIN !

Lien vers le commentaire
Partager sur d’autres sites

désolé de vous embeter encore :ouioui: mais ca ne fonctionne toujours pas chez moi voila ce que j'ai mis :

<?

$i = 0;

function parcourir($repertoire)

{

// on ouvre le répertoire

$rep = opendir($repertoire);

// pour chacun des fichiers dedans...

while ( ($fic = readdir($rep)) !== false)

{

// on ne prend pas les répertoires . et ..

if ( ($fic == ".") || ($fic == "..") ) continue;

// si c'est un répertoire, on recommence récursivement

if ( is_dir($repertoire.$fic) ) parcourir($repertoire.$fic);

// sinon c'est un fichier, et on regarde s'il commence par "4p"

else

{

if (substr($fic,0,2) == "4p")

{

echo "reussi";

$i++;

echo "$i";

}

}

}

}

parcourir ("/essai/");

?>

ca me trouve toujours les 4p du dossier essai mais les fichiers dans les sous dossiers de essai ne sont pas trouvés :yes:

sinon chapeau pour l'algorithme :non:

Lien vers le commentaire
Partager sur d’autres sites

:non: pour tes commentaires un peu partout, y'en a qui donne souvent que le code. :yes:

Héhé moi je commente toujours à mort.

C'est pratique quand tu débugges ton code quelque temps après, et surtout quand tu le files à quelqu'un.

Bon sinon je ne vois pas pourquoi il ne fonctionne pas chez toi, ici ça marchait...

Bon je rejette un oeil au cas où...

PS : Jeep, pense à la balise [ CODE ], c'est pratique :ouioui:

Lien vers le commentaire
Partager sur d’autres sites

Non décidément je suis très c :yes: n, c'est ma faute.

Je dis de super bien faire attention à mettre un / à la fin des noms de répertoires, et j'oublie de l'ajouter dans mon propre code...

Désoléééé :ouioui:

(ça marchait chez moi pourtant, mais j'avais pas re-posté la bonne version)

Essaie maintenant, ça devrait aller mieux :

function parcourir($repertoire)
{
// on ouvre le répertoire
$rep = opendir($repertoire);

// pour chacun des fichiers dedans...
while ( ($fic = readdir($rep)) !== false)
{
  // on ne prend pas les répertoires . et ..
  if ( ($fic == '.') || ($fic == '..') ) continue;

  // si c'est un répertoire, on recommence récursivement
  if ( is_dir($repertoire.$fic) ) parcourir($repertoire.$fic.'/');

   // sinon c'est un fichier
  else
  {
    // on regarde s'il commence par "4p"
    if (substr($fic,0,2) == "4p")
    {
      // ici tu fais ce que tu veux avec ton fichier... :)
      // le chemin complet de ton fichier est :   $repertoire.$fic
    }
  }
}
}


Pour appeler la fonction, tu donnes simplement le répertoire racine :
parcourir ("/images/");      (par exemple)
// ATTENTION, NE PAS OUBLIER LE / A LA FIN !

Lien vers le commentaire
Partager sur d’autres sites

C'est marqué dessus :yes:

Quand tu listes le contenu d'un répertoire donné, la fonction php te sort absolument tout ce qu'il y a dedans : les fichiers, les liens, les répertoires... Et parmi les répertoires justement il y a des liens vers le répertoire courant (".") et le répertoire parent ("..").

Si je laissais ma fonction appeler le répertoire courant (.) ou son répertoire parent (..), ma fonction récursiverait à l'infini : le répertoire est lu, il se voit lui-même et se relit, et se re-voit lui-même, et se re-relit, etc..., ou alors il appelle son répertoire parent, qui le rappelle, etc... à l'infini.

Donc j'élimine ces deux répertoires non intéressants dès le début.

C'est un grand classique des algos de parcours d'arborescence :craint:

Lien vers le commentaire
Partager sur d’autres sites

Je suis un newbie en programmation tout court :8

D'ailleurs j'ai encore un probleme :8 :

j'ai fait une fonction pour renommer mais lorsque j'écris tout le code sans faire de fonction (ce qui est plus long) dans le programme ca marche. mais lorsque je mets cela en fonction ca m'indique :

Warning: rename() failed (Permission denied)

voila ce que la fonction :

function renommer($fichier,$type)

{

$length=strlen($type);

if (strtoupper(substr($fichier,0,$length))==$type)

{

echo "$fichier";

$prefixe=substr($fichier,$length);

$prefixe=trim($prefixe);

$prefixe=trim($prefixe,"_");

$nouveaunom=$type.$prefixe;

echo " $nouveaunom <br>";

rename($repertoire.'/'.$fic,$repertoire.'/'.$nouveaunom);

}

}

Lien vers le commentaire
Partager sur d’autres sites

Dans ta fonction "renommer", tu ne lui donnes pas le répertoire en paramètre.

Donc dans le corps de la fonction, ta variable $repertoire ne contient rien, ce qui fait que le nom+chemin complet de ton fichier devient :

rename('/'.$fic,$repertoire.'/'.$nouveaunom);

Autrement dit, "/quelquechose", ce qui pointe vers la racine de ton arborescence, où ton fichier ne se trouve pas, d'où l'erreur.

Je présume que ta fonction pour renommer est appelée depuis l'algo que je t'ai donné ?

Dans ce cas tu devrais rajouter un paramètre "$repertoire" à ta fonction "renommer", et enlever le / entre le répertoire et le fichier, puisque mon algo suppose que le répertoire se termine déjà par un /

function renommer($repertoire,$fichier,$type)
{
 $length=strlen($type);
 if (strtoupper(substr($fichier,0,$length))==$type)
 {
   echo "$fichier";
   $prefixe=substr($fichier,$length);
   $prefixe=trim($prefixe);
   $prefixe=trim($prefixe,"_");
   $nouveaunom=$type.$prefixe;
   echo " $nouveaunom <br>";
   rename($repertoire.$fic, $repertoire.$nouveaunom);
 }
}

Lien vers le commentaire
Partager sur d’autres sites

Ca m'envoie toujours la même erreur... :ouioui:

<?php
function renommer($rep,$fichier,$type)
{
 $length=strlen($type);
 if (strtoupper(substr($fichier,0,$length))==$type)
 {
 	echo "$fichier";
 	$prefixe=substr($fichier,$length);
 	$prefixe=trim($prefixe);
 	$prefixe=trim($prefixe,"_");
 	$nouveaunom=$type.$prefixe;
 	echo "  $nouveaunom <br>";
 	rename($rep.$fic, $rep.$nouveaunom);
 }
}


function parcourir($repertoire)
{
 	// on ouvre le répertoire
 	$rep = opendir($repertoire);

 	// pour chacun des fichiers dedans...
  while ( ($fic = readdir($rep)) !== false)
 	{
     // on ne prend pas les répertoires . et ..
     if ( ($fic == ".") || ($fic == "..") ) continue;

     // si c'est un répertoire, on recommence récursivement
     if ( is_dir($repertoire.$fic) ) parcourir($repertoire.$fic.'/');

     // sinon c'est un fichier, 
 	else
 	{
     	
 	renommer($repertoire,$fic,'4P');
 	renommer($repertoire,$fic,'RDP');
 	renommer($repertoire,$fic,'RDI');
 	renommer($repertoire,$fic,'ROP');
 	renommer($repertoire,$fic,'IC');
 	renommer($repertoire,$fic,'DOP');

 	}
 }
}


parcourir ("/essai/");
?>

Lien vers le commentaire
Partager sur d’autres sites

Si je ne le mets pas en fonction ca marche bien. Par contre c'est plus long puisqu'il faut répéter tout le temps.

En fait dans le DD plusieurs meme types de fichiers sont nommés différemment : 4P_truc, 4p truc, 4p_machin, RdP truc, etc. et on veut ke je nomme 4Ptruc ou RDPmachin en majuscule et ssans espace.

voila ce que ca donne en tapant sans passer par une fonction :

//on regarde s'il commence par "RDP"
   elseif (strtoupper(substr($fic,0,3)) == "RDP")
     	{	
   	echo "$fic";    //affiche le nom du fichier
   	$prefixe=substr($fic,3);  //extrait le nom du fichier a partir de la 3eme lettre
   	$prefixe=trim($prefixe);  // enleve les espaces
   	$prefixe=trim($prefixe,"_");  // enleve les _
   	$nouveaunom='RDP'.$prefixe;  //ajoute RDP devant
   	echo "   $nouveaunom <br>";  //affiche le nouveau nom
   	rename($repertoire.'/'.$fic,$repertoire.'/'.$nouveaunom); //renomme avec le nouveau nom
       

   	}

Lien vers le commentaire
Partager sur d’autres sites

Bon bin autant le laisser comme ca puisque ca marche :mdr:

Mais jaurais encore une chitite question :D : dans les propriétés avancés d'un fichier sous windows on peut voir "attributs d'archivage et d'indexation" avec la case "le fichier est prêt à être archivé".

Existe t il un moyen en PHP ou en C de vérifier si la case est cochée ou pas ?

Merci !! :chinois:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...