begin process at 2012 05 31 06:18:09
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

POO

 > 

Autre

 > 

premier pas avec spl, premier deboire


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

premier pas avec spl, premier deboire

vendredi 9 octobre 2009 à 10:52:24 | premier pas avec spl, premier deboire

devcphp12

Bonjour à tous,

J'ai voulu me lancer à la spl ( soyons fou tiens) en commencant par DirectoryIterator.

voici une ancienne fonction que j'avais :
/** methode de parcours d'un dossier ou les rapports ont deja ete generées et dans lequel on ne cherche que des fichiers pdf ou doc , il suffit de mettre l'extension du fichier desiré en deuxieme arguement
* la methode retourne le listing des fichiers trouvés sous forme d'un tableau
**/
function AfficheFichier($sCheminVersRapportAEnvoyer,$sFiltre){
static $aMyArray=array();

if ($pDirectory = opendir($sCheminVersRapportAEnvoyer)) {// opendir nous renvoit un pointeur sur le dossier
// on initiliase

while (false !== ($sFile = readdir($pDirectory))){

//je ne dois convertir que les fichiers .doc en .pdf car il se peut qu'il y ait des fichiers .pdf
//$sExtensionFile renvoit une chaine de carctere ie doc ou pdf ou jpg
$sExtensionFile=pathinfo($sFile,PATHINFO_EXTENSION);

if ($sFile != "." && $sFile != "..") {
if ($sExtensionFile == $sFiltre){
// for debug wb_message_box($window, $sFile,"fichier",WBC_INFO);
$aMyArray[]=$sFile;
}
}

}// fin du while
closedir($pDirectory);// je ferme le handle de manipulation du dossier qui contient les cartes ernt
return $aMyArray;
}else{
wb_message_box($window,'Listage des fichiers impossible','Répertoire illisible',WBC_INFO);
}
}


et voici avec DirectoryIterator :
//on etend la classe directoyinterator afin de creer une methode qui nous permettent de retourner l'extension d'un fichier **/
class MyDirectoryIterator extends DirectoryIterator implements Iterator {

public function GetExtensionOfFile(){

/** avec la spl plus besoin de passer la variable du nom de fichier à tester car on le recupere le fichier courant (parcourut par notre boucle foreach) avec la methode GetFileName()
* cette methode etant disponible dans la classe parente DirectoryIterator , on fait appel à elle par parent::getFilename()
**/
$sFilename = parent::getFilename();

//on commence par utiliser la methode isFile issue de la classe parente DirectoryIterator pour verifier que nous sommes bien en presence d'un fichier
if ( TRUE === parent::isFile($sFilename)){
//on recupere l'extension du fichier
$sExtensionFile=pathinfo($sFilename,PATHINFO_EXTENSION);
return $sExtensionFile;
}
}
}

/** fonction d'affichage du contenu d'un fichier avec la spl **/
function AfficheFichierWithSpl($sCheminVersRapportAEnvoyer,$sFiltre){
static $aMyArray=array();

foreach (new MyDirectoryIterator($sCheminVersRapportAEnvoyer) as $sValeurFile){

if(TRUE === $sValeurFile->isDot() ) // on supprime les dossiers donc . et ..
{
if ( $sFiltre === $sValeurFile->GetExtensionOfFile())
$aMyArray[] = $sValeurFile; // on ne recupere que les fichiers dont les extensions sont definies par $sFiltre ( doc ou pdf ou jpg et on les renvoit sous forme d'un tableau

}
}
return $aMyArray;
}

Mais voila ca ne marche pas et je n'ai aucun moyen de debuguer ca.

Quelqu'un peut il m'aiguiller.

ps : je commence juste avec la spl
vendredi 9 octobre 2009 à 18:33:01 | Re : premier pas avec spl, premier deboire

neigedhiver

Salut,

Je vais faire un peu d'autopromo, une fois n'est pas coutume...
http://www.phpcs.com/codes/PHP5-LISTING-REPERTOIRE-AVEC-FILTRES_45125.aspx
Il s'agit d'un package de classes permettant de parcourir récursivement ou non un répertoire en filtrant les fichiers affichés en fonction de différents critères.

Je pense que tu ne cherches pas forcément un truc tout fait, puisque visiblement tu cherches à comprendre, et c'est très bien. Mais peut-être que justement, avoir des classes qui fonctionne déjà développées te permettra de mieux voir ce qu'il faut faire pour arriver au résultat attendu.
Si tu as d'autres questions après la consultation de cette source, n'hésite pas à les poser, j'y répondrai avec plaisir.

P.S. : Ca fait plaisir que quelqu'un passe de readdir() à DirectoryIterator :)

--
Neige

N'hésitez pas à lire la doc
vendredi 9 octobre 2009 à 18:56:51 | Re : premier pas avec spl, premier deboire

devcphp12

Merci neige,

je vais essayer de digerer ton code qui est bien au dela d emon niveau.

deja je commence par quelques petites questions :

quand tu es parti directement de splfileinfo et non de directoryIterator, pourrais tu m'expliquer ton choix?

d'autre part des le debut , la documentation officielle fait reference à
DirectoryIterator extends SplFileInfo implements Iterator , Traversable , SeekableIterator

Donc je comprends pourquoi tu cree ta fonction getextension à partir de SplFileInfo ( tu reviens à la classe de base).

d'autre part n je ne comprends pas pourquoi j'ai ecris ceci ce matin
class MyDirectoryIterator extends DirectoryIterator implements Iterator
DirectoryIterator extends SplFileInfo implements Iterator d'apres la doc officielle donc rien que la j'ai fait une erreur.

A bientot des que j'aurais vraiment compris ton script et que je puisse t'en parler sur le bout des doigts

vendredi 9 octobre 2009 à 20:11:49 | Re : premier pas avec spl, premier deboire

neigedhiver

Si tu as besoin de faire fonctionner quelque chose, ma source te permet d'avoir de quoi parcourir tes répertoires très facilement. L'utilisation est suffisament simple pour que n'importe qui puisse s'en servir.
Pour ce qui est de comprendre, évidemment, il faut un peu plus de "travail" quand on découvre juste la SPL. Mais pour ça, DirectoryIterator est un parfait exemple de la simplification que la SPL apporte aux codes qui l'utilisent. Sans parler de la limitation des erreurs généralement dûes à une mauvaise utilisation de readdir().

J'avais aussi posté un article sur mon blog dans lequel je détaillais la conception (le début tout au moins) de cette source (j'ai laissé trainer le lien dans la conclusion de la source). Ca devrait peut-être t'apporter quelques éclaircissements sur le fonctionnement général.

Mais comme je suis dans un bon jour (en fait, c'est surtout du prosélytisme pour la SPL), je vais faire un petit récapitulatif ici.

Comme tu peux le voir, j'ai plusieurs classes.
La classe centrale est XDir, c'est elle qui est manipulée par l'utilisateur. Cette classe étend FilterIterator et non pas DirectoryIterator, parce que j'avais besoin d'une classe qui filtre, ce que fait (en toute logique) FilterIterator. Le constructeur de FilterIterator prend en argument un itérateur : cet itérateur sur lequel on va appliquer les filtres. XDir simplifie la construction de FilterIterator en lui passant en argument un itérateur qui convient pour les dossiers : soit un DirectoryIterator, pour un parcours simple, soit un RecursiveIteratorIterator pour le parcours récursif. RecursiveIetratorIterator prend lui-même un itérateur récursif en argument (RecursiveDirectoryIterator en l'occurrence). Ca fait donc 3 itérateurs imbriqués les uns dans les autres, ce que XDir rend totalement transparent.

La classe XDirFileInfo étend SplFileInfo pour lui apporter de quoi simplifier un peu plus la vie de l'utilisateur, avec des méthodes qui me paraissent quasi indispensables comme getExtension() et isHidden(). La première, surtout, donne la vraie extension du fichier, de manière certaine. La plupart des codes trouvés sont ultra-simplistes et utilisent des fonctions qui retournent "htaccess" pour un fichier .htaccess, ce qui est erronné : htaccess est le nom du fichier, pas l'extension, puisqu'il n'en a pas, c'est juste un fichier caché. DirectoryIterator (et donc RecursiveDirectoryIterator) peut retourner une instance d'une classe spécifique lors du parcours des fichiers. Par défaut, c'est SplFileInfo. Ici, on utilise XDirFileInfo.

Enfin, XDirFilter est une classe abstraite étendue par tous les filtres. La méthode accept() est celle qui sera appelée par XDir pour savoir si le fichier doit être conservé ou pas (c'est à dire s'il passe ou non le filtre).

Le package utilise l'API de Reflexion de PHP5 pour vérifier que les filtres sont valides. Rien de bien compliqué là dedans, même si la doc sur l'API de Réflexion est particulièrement peu fournie : le code et les commentaires devraient suffire.

En fait, c'est assez simple, même si c'est un peu complexe : quelques classes, mais le fonctionnement n'a rien d'extra-ordinaire... XDir ne fait que faciliter l'instanciation de l'itérateur qu'on utilise pour parcourir le répertoire, les filtres sont assez élémentaires à utiliser/comprendre/écrire et XDirFileInfo n'apporte que deux méthodes supplémentaires à SplFileInfo. Cela dit, il est vrai que c'est du code qui n'a plus grand chose à voir avec du procédural, il est donc légitime que l'assimilation prenne un peu de temps.

Voilà voilà, en espérant que ça te sera utile, tout ça ;)

--
Neige

N'hésitez pas à lire la doc
jeudi 15 octobre 2009 à 21:16:35 | Re : premier pas avec spl, premier deboire

devcphp12

Petite question neige d'hiver, les testes que je veux effectuer à savoir ne recuperer que les fichiers .doc et seulement des fichiers passent obligatoirement par la fonction isvalid().

Ai je tort ou raison?
jeudi 15 octobre 2009 à 21:19:44 | Re : premier pas avec spl, premier deboire

neigedhiver

Non, ils passent par la méthode accept(), qui est la méthode de FilterIterator() qui détermine si un fichier doit être conservé ou non par le filtre.
La méthode valid() (et pas isvalid()) indique à la boucle qui itère si l'élément suivant est un élément valide, donc s'il faut continuer ou pas d'itérer.

--
Neige

N'hésitez pas à lire la doc


Cette discussion est classée dans : fichier, methode, fichiers, spl, amyarray


Répondre à ce message

Sujets en rapport avec ce message

Encore les fichiers [ par koko ] bon c'est encore moi avec mes fichiers.txt... cette fois-ci, je voudrais que lorque j'ouvre le fichier, il mets les variables qui sont à l'intérieur d PHP ET LES FICHIERS ???? [ par GazGaz ] lu all alors voila je voulais savior si c'était possible avec php d'aller chercher des informations dans un fichier qui est structué de la meme manier Ouverture de fichiers distants impossible [ par BSide ] Bonjour,je rencontre un pbl que g du mal à dépatouiller.Voici le topo :- mon appli (un intranet) se trouve sur un serveur A. Elle permet entre autre d Edition de fichiers txt [ par ceeno ] Bonjour,voila, j'aimerais écrire dans un fichier texte entre 2 balises.Par exemple, prenons un fichier texte.txt qui contient :Je souhaite ajouter une Copie de fichiers distants [ par ChocoBiscuit ] Bonjour tt le mondeTout d'abord, je sais k'il y a bocoup de topics de ce type, mais je n'ai pas trouvé mon cas (trop de fichiers.... arf... fainéant k Compresser les fichiers pour Upload [ par Hpic ] Bonjour ,Quelqu'un aurait-il l'amabilité de m'expliquer comment compresser un fichier en *.*.zip lors de l'upload du fichier sur un serveur ( apache fichiers temp [ par gg1 ] lors d'un transfert de fichier par PC Link ('ports USB) entre mon notebook et mon desktop, des fichiers se sont mal transdmis et ne sont pas arrivés s créer un fichier ???? petit PB [ par MangaII ] Hello les gars !Voilà, j'ai un petit soucis, j'ai besoin de créer des fichiers (TXT) sur mon site, depuis ma page en PHP ! le PB, c que je pe pas ! Je Extraires les URLs de fichiers sous forme CSV [ par spectroman ] J'aurai besoin d'un script en PHP qui parse une page (HTML) pour en extraire les liens et leurs noms dans un fichier texte...sous la forme :nomdulien1 Question FTP [ par nunulle33 ] ben voila petite question sur la fonction ftp . Disons que j'ai une machine distante qui heberge un serveur FTP et je voudrais downloader l'ensemble d


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,452 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales