Accueil > Forum > > > > Probleme avec la lib SPL
Probleme avec la lib SPL
jeudi 26 novembre 2009 à 12:02:27 |
Probleme avec la lib SPL

windofo
|
Bonjour,
j'ai mis un peu le nez dans la lib SPL, et j'ai voulu m'inspirer du code source de malalam (j'en profite pour le remercier ainsi que tous les autres (neige, etc.) pour leurs nombreuses contributions)) pour faire un parcours de répertoire tout simple et j'avoue ne pas comprendre certain fonctionnement, entre les erreurs de segmentation et les dossiers répétés plusieurs fois je suis un peu perdu...
voici le code source:
Code PHP :
class Dossier_RecursiveDirectoryIterator extends RecursiveDirectoryIterator {
/**
* affiche les dossiers
*
* @var boolean
*/
protected $bDir = true;
/**
* affiche les fichiers
*
* @var boolean
*/
protected $bFile = true;
/**
* filtrer les dossiers suivant une expression régulière
*
* @var string
*/
protected $sRegExpDir = '^.*$';
/**
* filtrer les fichier suivant une expression régulière
*
* @var string
*/
protected $sRegExpFile = '^.*$';
/**
* parcours recursif
*
* @var boolean
*/
protected $bRecurse = true;
/**
* propriétés qui peuvent être définies
*
* @var array
*/
protected $aCanBeSet = array (
'REGEXP_DIR',
'REGEXP_FILE',
'DIR',
'FILE',
'PATH',
'RECURSE'
);
/**
* path
*
* @var string (valid path)
*/
protected $sPath;
/**
* messages d'erreur
*
* @var string
*/
const ERROR_PATH_NOT_FOUND = '{__PATH__} n\'a pas été trouvé';
const ERROR_PROP_NOT_SETABLE = '{__PROP__} n\'est pas une propriété ';
const ERROR_BAD_PROP_VALUE = '{__VAL__} n\'est pas une valeur correcte pour la propriété: {__PROP__}';
/**
* getChildren
*
* @return subiterator
*/
public function getChildren () {
$iSub = new self ($this -> getPathname ());
$iSub -> bDir = $this -> bDir;
$iSub -> bFile = $this -> bFile;
$iSub -> sRegExpDir = $this -> sRegExpDir;
$iSub -> sRegExpFile = $this -> sRegExpFile;
return $iSub;
}
/**
* path
*
* @return string
*/
public function key () {
return $this -> getPath ();
}
/**
* retourne la valeur du fichier ou du dossier courant
*
* @return string
*/
public function current () {
return $this -> getFileName ();
}
/**
* vérifie si il y a un élément existant apres avoir appelé rewind() ou next().
*
* @return boolean
*/
public function valid () {
if (true === parent::valid ()) {
if (true === $this -> isDir ()) {
if (false === $this -> bDir || !preg_match ($this -> sRegExpDir, $this -> current())) {
$this -> next ();
return $this -> valid ();
} else {
return true;
}
} else {
if (false === $this -> bFile || !preg_match ($this -> sRegExpFile, $this -> current())) {
$this -> next ();
return $this -> valid ();
} else {
return true;
}
}
}
return false;
}
/**
* vérification des propriétés via la méthode magique __set
*
* @param string $sProp
* @param mixed $mVal
*/
public function __set ($sProp, $mVal) {
if (!in_array ($sProp, $this -> aCanBeSet)) {
throw new Exception (str_replace ('{__PROP__}', $sProp, self::ERROR_PROP_NOT_SETABLE));
}
switch ($sProp) {
case 'REGEXP_DIR' :
if (!is_string ($mVal)) {
throw new Exception (str_replace (array ('{__VAL__}', '{__PROP__}'), array ($mVal, $sProp), self::ERROR_BAD_PROP_VALUE));
}
$this -> sRegExpDir = $mVal;
break;
case 'REGEXP_FILE' :
if (!is_string ($mVal)) {
throw new Exception (str_replace (array ('{__VAL__}', '{__PROP__}'), array ($mVal, $sProp), self::ERROR_BAD_PROP_VALUE));
}
$this -> sRegExpFile = $mVal;
break;
case 'DIR' :
if (!is_bool ($mVal)) {
throw new Exception (str_replace (array ('{__VAL__}', '{__PROP__}'), array ($mVal, $sProp), self::ERROR_BAD_PROP_VALUE));
}
$this -> bDir = $mVal;
break;
case 'FILE' :
if (!is_bool ($mVal)) {
throw new Exception (str_replace (array ('{__VAL__}', '{__PROP__}'), array ($mVal, $sProp), self::ERROR_BAD_PROP_VALUE));;
}
$this -> bFile = $mVal;
break;
case 'RECURSE' :
if (!is_bool ($mVal)) {
throw new Exception (str_replace (array ('{__VAL__}', '{__PROP__}'), array ($mVal, $sProp), self::ERROR_BAD_PROP_VALUE));
}
$this -> bRecurse = $mVal;
break;
case 'PATH' :
if (!is_dir ($mVal)) {
throw new Exception (str_replace ('{__PATH__}', $mVal, self::ERROR_PATH_NOT_FOUND));
}
$this -> sPath = $mVal;
break;
}
}
}
class Dossier_Dir extends Dossier_RecursiveDirectoryIterator {
/**
* Itérateur
*
* @var iterator
*/
private $iterator = null;
/**
* messages d'erreur
*
* @var string
*/
const ERROR_NBR_ARG = 'Le nombre d\'arguments est incorrect';
const ERROR_TYPE_ARG = 'Le type d\'argument est incorrect';
/**
* Constructeur
*
*
* @param string $sPath (valid path)
*/
public function __construct ($sPath) {
if (!is_dir ($sPath)) {
throw new Exception (str_replace ('{__PATH__}', $sPath, self::ERROR_PATH_NOT_FOUND));
}
$this -> sPath = $sPath;
}
/**
* construction d'un itérateur du répertoire venant d'un chemin (string)
*
* @return iterator
*/
public function getDir () {
parent::__construct ($this -> sPath, 0);
if (true === $this -> bRecurse) {
$this -> iterator = new RecursiveIteratorIterator ($this, RecursiveIteratorIterator::LEAVES_ONLY);
} else {
$this -> iterator = $this;
}
return $this -> iterator;
}
/**
* ajout de filtres
* - addFilter ('filtre_1', 'val', 'filtre_2', true, etc.)
* - addFilter (array('filtre_1' => 'val', 'filtre_2' => true, etc.))
*
* @param mixed
*/
public function addFilter () {
$oArg = new ArrayObject (func_get_args ());
$it = $oArg -> getIterator ();
$numbArg = $it -> count ();
if ($numbArg > 1 && 0 == bcmod ($numbArg, 2)) {
while ($it -> valid ()) {
$prop = $it -> current ();
$it -> next ();
$val = $it -> current ();
if (is_string ($prop) && !empty ($prop)) {
$this -> $prop = $val;
$it -> next ();
} else {
throw new Exception (self::ERROR_TYPE_ARG);
}
}
} else if (1 == $numbArg) {
$aArg = $it -> current ();
if (is_array ($aArg) && !empty ($aArg)) {
foreach($aArg AS $prop => $val) {
if (is_string ($prop) && !empty ($prop)) {
$this -> $prop = $val;
} else {
throw new Exception (self::ERROR_TYPE_ARG);
}
}
} else {
throw new Exception (self::ERROR_TYPE_ARG);
}
} else if ($numbArg > 1) {
throw new Exception (self::ERROR_NBR_ARG);
}
}
}
voici mon test:
Code PHP :
try {
$oDir = new Dossier_Dir ('/usr/dossier/');
} catch (Exception $e) {
echo $e -> getMessage ();
}
$oDir -> addFilter ('RECURSE', true, 'REGEXP_DIR', '/^[0-9]{2}$/', 'REGEXP_FILE', '/^FILE$/');
$aDir = $oDir -> getDir ();
while ($aDir -> valid ()) {
if ($aDir -> isDot ()) {
$aDir -> next ();
}
if ($aDir -> isDir ()) {
print "dossier: " . $aDir -> current (). "\n";
} else {
print "fichier: " . $aDir -> current () . "\n";
}
$aDir -> next ();
}
dans mon exemple j'ai une série de répertoire avec les fichiers comme ci dessous:
01
- FILE1
- FILE2
02
- FILE3
- FILE4
03
04
tmp
mon test devrait m'afficher:
01
- FILE1
- FILE2
02
- FILE3
- FILE4
03
04
pourtant j'ai ce résultat:
01
01
- FILE1
- FILE2
02
- FILE3
- FILE4
03
04
et si je ne précise pas d'expression régulière j'ai en plus des résultats précédents plein de lignes avec des warnings
Warning: preg_match(): No ending delimiter '^' found in /Dossier/RecursiveDirectoryIterator.php on line 142
etc..
si vous avez une idée...
merci d'avance
Wind
|
|
lundi 30 novembre 2009 à 21:27:07 |
Re : Probleme avec la lib SPL

neigedhiver
|
Salut,
Pourquoi utilises-tu une boucle while et pas une boucle foreach ? Foreach sert justement à itérer sur des tableaux, ou des objets implémentant Traversable. Foreach va automatiquement exécuter rewind(), valid(), next(), etc.
Avec ta boucle while(), tu cherches à reproduire le comportement de l'itération produite par foreach, mais je me demande si tu ne la reproduis pas avec une erreur qui expliquerait la duplication du premier répertoire.
Idem dans ta méthode addFilter()...
Sincèrement, utilise foreach() qui sert spécialement à l'itération, alors que while() pas du tout.
Concernant isDot(), par défaut, RecursiveDirectoryIterator ne tient pas compte des dossiers points. En tout cas, dans ma source (dont il me semble que tu t'es inspirée sur certains points), je ne m'occupe pas de isDot()...
Pour tes expressions réulières, le problème est qu'elles ne sont effectivement pas valides, comme l'indique le message d'erreur ;)
Code PHP : protected $sRegExpDir = '^.*$';
protected $sRegExpFile = '^.*$';
Ce sont des PCRE, il faut spécifier le délimiteur... Par exemple :
Code PHP : protected $sRegExpDir = '`^.*$`';
protected $sRegExpFile = '`^.*$`';
Du coup, je constate que tu exécutes à CHAQUE itération l'expression régulière... Si c'est pour tout laisser passer, je trouve dommage de bouffer des ressources en PCRE inutile...
--
Neige
Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
|
|
vendredi 18 décembre 2009 à 10:01:40 |
Re : Probleme avec la lib SPL

windofo
|
je te remercie pour ta réponse, je vais bricoler ca ce we
Wind
|
|
Cette discussion est classée dans : array, error, prop, if, mval
Répondre à ce message
Sujets en rapport avec ce message
formulaire Dynamique A l'Aide !! [ par naceradebut ]
<?php Bonjour a Tous , j'ai un problème qui me rend Dingue cela fait plus de 3 semaines jour et nuit je bosse dessus et je craque, donc Merci Beauco
Formulaire avec pièce jointe [ par lorenzo16000 ]
Bonjour je souhaite rendre mon fichier file obligatoire, pouvez-vous me donner un coup de main pour savoir comment je peu faire car j'ai fait des test
syntax error, unexpected T_IF [ par uzu ]
BonjourJ'ai cette erreur syntax error, unexpected T_IF; et je n'arrive pas à résoudre;1/voici le code que j'ai mis dans pageok.php :if($mot_de_passe
comment réaffiché un formulaire caché [ par lert ]
Bonjour, voilà je n'ai que quelques connaissances en php, j'ai récupéré un script immobilier qui contient un formulaire avec juste un onglet pour cho
If $_POST {} Erreur ? [ par belette321 ]
Bonsoir, voilla je developpe un script mais je croi qu'il estincorrect alor j'aimerais avoir. je vous expose mon problemme ...Bon mon erreur est :Pars
Parse error: syntax error, unexpected T_IF [ par didygwatinik ]
Bonjour,J'ai l'erreur : Parse error: syntax error, unexpected T_IF in C:\wamp\www\JeunesTalents\espaceartiste.php on line 4 pouvez vous m'aider ??? s'
exec() erreur 1 non justifié [ par Bikarfioul ]
Salut ! J'ai un legé différent avec mon serveur PHP. En effet si je tape une commande de ce style sous une console [CODE] rsh toto -l root -n /sc
Problème avec code d'upload [ par Koppa ]
Bonjour je crée présentement un site avec une possibilté de partager des fichiers mais voilà je n'arrive pas à faire fonctionné un des codes: upload.p
Formulaire [ par kanye1982 ]
YoussBonjour tout le monde voila ma questionJe suis en train de faire un formulaire d'inscription en PHP ;) et j'aimerais avoir un petit coup de main,
Test d'un champ dans un formulaire [ par kanye1982 ]
YoussVoila ma question elle ne devrait pas être trop compliqué j'ai un formulaire en php et dans celui-ci le champ "raison" qui est un champ à choix m
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|