Jeep Posted May 7, 2004 Share Posted May 7, 2004 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 ! ) (si jamais c faisable ): 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 ?? Merci d'avance pour votre aide Link to comment Share on other sites More sharing options...
Sentinel Posted May 7, 2004 Share Posted May 7, 2004 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 , mais ça devrait globalement être bon. Tiens-nous au courant ! Link to comment Share on other sites More sharing options...
theocrite Posted May 7, 2004 Share Posted May 7, 2004 Je ne connais pas le php, mais il me semble que while ( ($fichier = readdir($rep)) !== false) devrait être remplacé par ça : while ( ($fic = readdir($rep)) !== false) Link to comment Share on other sites More sharing options...
Sentinel Posted May 7, 2004 Share Posted May 7, 2004 oui oui pardon, j'ai légèrement changeé de nom de variable en plein milieu (bravo pour ton oeil de lynx théo ! ), honte à moi 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. Link to comment Share on other sites More sharing options...
theocrite Posted May 7, 2004 Share Posted May 7, 2004 bravo pour ton oeil de lynx links honte à moi Meuhhhhh non.... Link to comment Share on other sites More sharing options...
Jeep Posted May 10, 2004 Author Share Posted May 10, 2004 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 ! Link to comment Share on other sites More sharing options...
Sentinel Posted May 10, 2004 Share Posted May 10, 2004 Hummm déjà je viens de m'apercevoir qu'il fallait mettre un "else" au test qui détermine si c'est un dossier (si c'est un dossier on récursive, SINON on regarde s'il commence par 4p...). Bon, je vais jeter un oeil. Link to comment Share on other sites More sharing options...
Sentinel Posted May 10, 2004 Share Posted May 10, 2004 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 ! Link to comment Share on other sites More sharing options...
XZombi Posted May 10, 2004 Share Posted May 10, 2004 pour tes commentaires un peu partout, y'en a qui donne souvent que le code. Link to comment Share on other sites More sharing options...
Jeep Posted May 10, 2004 Author Share Posted May 10, 2004 désolé de vous embeter encore 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 sinon chapeau pour l'algorithme Link to comment Share on other sites More sharing options...
Sentinel Posted May 10, 2004 Share Posted May 10, 2004 pour tes commentaires un peu partout, y'en a qui donne souvent que le code. 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 Link to comment Share on other sites More sharing options...
Sentinel Posted May 10, 2004 Share Posted May 10, 2004 Non décidément je suis très c 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éééé (ç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 ! Link to comment Share on other sites More sharing options...
Jeep Posted May 11, 2004 Author Share Posted May 11, 2004 yes ! ca a marché ! merci beaucoup !! Link to comment Share on other sites More sharing options...
Sentinel Posted May 11, 2004 Share Posted May 11, 2004 Bonne chance pour la suite ! Link to comment Share on other sites More sharing options...
Jeep Posted May 12, 2004 Author Share Posted May 12, 2004 ah encore une questin... a koi sert cette ligne ?: // on ne prend pas les répertoires . et .. if ( ($fic == ".") || ($fic == "..") ) continue; Link to comment Share on other sites More sharing options...
Sentinel Posted May 12, 2004 Share Posted May 12, 2004 C'est marqué dessus 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 Link to comment Share on other sites More sharing options...
Jeep Posted May 12, 2004 Author Share Posted May 12, 2004 aaaahh.... c tout clair je savais pas ke ca prenait aussi les liens des répertoires. oui je débute en php kan gt venu faire mon stage je connaissais rien en php lol merci beaucoup Link to comment Share on other sites More sharing options...
Sentinel Posted May 12, 2004 Share Posted May 12, 2004 Oh c'est pas spécifique au PHP, c'est vraiment un piège classique, qu'on peut rencontrer dans n'importe quel langage quand on veut fouiller dans des répertoires. Link to comment Share on other sites More sharing options...
Jeep Posted May 13, 2004 Author Share Posted May 13, 2004 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); } } Link to comment Share on other sites More sharing options...
Sentinel Posted May 13, 2004 Share Posted May 13, 2004 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); } } Link to comment Share on other sites More sharing options...
Jeep Posted May 13, 2004 Author Share Posted May 13, 2004 Ca m'envoie toujours la même erreur... <?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/"); ?> Link to comment Share on other sites More sharing options...
Sentinel Posted May 13, 2004 Share Posted May 13, 2004 C'est peut-être ton algo de renommage qui est faux ? Tu veux renommer quoi en quoi ? Link to comment Share on other sites More sharing options...
Jeep Posted May 13, 2004 Author Share Posted May 13, 2004 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 } Link to comment Share on other sites More sharing options...
Jeep Posted May 13, 2004 Author Share Posted May 13, 2004 Bon bin autant le laisser comme ca puisque ca marche Mais jaurais encore une chitite question : 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 !! Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.