RecursiveDirectoryIterator

Mammouth du PHP | 1311 Messages

23 mars 2006, 22:14

salut
voila j'ai tres legerement modifie mon usine a gaz (on m'a toujours dit que j'etais brutal avce les moustiques)

au lieu d'enregistrer le nom du fichier dans le tableau $this->result
j'y enregistre l'objet RecursiveDirectoryIterator

mais l'ors du foreach impossibl d'acceder au metode de cet objet :?
class FileSysteme extends SingletonFactory implements IteratorAggregate
{
	private $result = array();

	private $filter = 'all';

	private $countfile = 0;
	private $countDir = 0;

	public static $Type = 'File';

	public function __construct(){
		
	}

	public static final function Singleton($instance_id = null){
		return parent::Singleton(__CLASS__);
	}

	public function __set($name,$value){
		switch ($name){
			case 'filter':$this->filter = $value;break;
			default:break;
		}
	}

	public function listDirectory( $dirname , $recursif = false){
		$dir = new RecursiveDirectoryIterator( $dirname );
		if( $recursif ){
			self::getFilesRecursif($dir);
		}
		else{
			self::getFiles($dir);
		}
	}


	private function getFiles(RecursiveDirectoryIterator $rdi ){
		if($rdi instanceof RecursiveDirectoryIterator )
		{
			for ($rdi->rewind();$rdi->valid();$rdi->next()){
				if(!$rdi->isDot()){
					if(FileSysteme::$Type === 'File' && $rdi->isFile){
						$this->getFile($rdi);
					}elseif (FileSysteme::$Type === 'Directory' && $rdi->isDir){
						$this->getDir($rdi);
					}
				}
			}
		}
	}


	private function getFilesRecursif(RecursiveDirectoryIterator $rdi,$depth=0) {
		if($rdi instanceof RecursiveDirectoryIterator )
		{
			for ($rdi->rewind();$rdi->valid();$rdi->next()) {
				if ($rdi->isDot()){
					continue;
				}
				if ($rdi->isDir() || $rdi->isFile() ) {
					if(FileSysteme::$Type === 'File' && $rdi->isFile()){
						$this->getFile($rdi);
					}elseif (FileSysteme::$Type === 'Directory' && $rdi->isDir()){
						$this->getDir($rdi);
					}
					if ($rdi->hasChildren()){
						self::getFilesRecursif($rdi->getChildren(),1+$depth);
					}
				}
			}
		}
	}

	
	private function getFile(RecursiveDirectoryIterator $rdi){
		if($rdi->isFile() && is_array($this->filter) && in_array($this->getExtention($rdi->current()),$this->filter)){
			$this->countfile++;
			$this->result[] = (object)$rdi;
		}
		elseif ($rdi->isFile() && $this->filter == 'all'){
			$this->countfile++;
			$this->result[] = (object)$rdi;
		}
	}
	
	private function getDir(RecursiveDirectoryIterator $rdi){
		if($rdi->isDir()){
			$this->countDir++;
			$this->result[] = (object)$rdi;
		}
	}
	
	
	public function getfileNumber(){
		return $this->countfile;
	}

	public function getDirNumber(){
		return (int)$this->countDir;
	}
	
	private function getExtention( $filename ){
		if(is_file($filename)){
			$tableau = explode('.',$filename);
			return (string) array_pop($tableau);
		}
		else {
			return true;
		}
	}

	public function getIterator(){
		$iterator = new Iterators($this->result);
		return $iterator;
	}
}
?>
?php

function __autoload($class){
	if($class !==""){
	require_once $class.'.class.php';
	}
}

$bench = bench::Singleton();
$bench->startBench();

//require_once dirname(__file__).'/FileSysteme/FileSysteme.class.php';
//set_time_limit(360);
$dir = new FileSysteme();//::Singleton();
FileSysteme::$Type = 'File';
//$dir = new FileSysteme();
$dir->filter = array('php');
$bench->addEvent('c\'est partie');
//$dir->set('type','File');
//$dir->set('filter',array('php'));
$dir->listDirectory('e:wamp/www',true);

$bench->addEvent('stop');
foreach ($bench as $value) {
	print_r($value);
}

foreach ($dir as $val){
	echo var_dump($val);
	echo $val->current();
	//echo $val->current()/*.'---'.$val->getSize().'---'.$val->getType().'<br/>'*/;
}

echo $dir->getFileNumber();
?>
voici l'erreur obtenu
<b>Fatal error</b>: Uncaught exception 'RuntimeException' with message 'Could not open file' in E:\parser\index.php:30
Stack trace:
#0 E:\parser\index.php(30): RecursiveDirectoryIterator->current()
#1 {main}
thrown in <b>E:\parser\index.php</b> on line <b>30</b><br />
et des info sur RecursiveDirectoryIterator

merci
Modifié en dernier par jeff le 23 mars 2006, 22:51, modifié 1 fois.

Mammouth du PHP | 983 Messages

23 mars 2006, 22:31

C'est quoi le but de ta classe?

Mammouth du PHP | 1311 Messages

23 mars 2006, 22:35

le but y en a pas trop c'est pour manipuler spl
mais si peut etre pour interger un parseur afin de faciliter la migration de site php4=>php5
voila

sinon pas trop de but
mais je vois pas pourquoi je n'arrive pas acceder aux methodes

Mammouth du PHP | 983 Messages

23 mars 2006, 22:42

Il maanque la classe SingletonFactory pour tester.

Mammouth du PHP | 1311 Messages

23 mars 2006, 22:43

voila voila
<?php
abstract class SingletonFactory
{
	protected  static $_instance = array();
	
	protected function __construct(){}
	
	protected static function Singleton($instance_id = null){
		if(!isset(self::$_instance[$instance_id])){
			if(!class_exists($instance_id)){
				return false;
			}
			self::$_instance[$instance_id] = new $instance_id();
		}
		return self::$_instance[$instance_id];
	}
}

?>
class Iterators implements Iterator
{
	private $array=array();
	private $key;
	private $current;
	
	public function __construct($array)
	{
		$this->array=$array;
	}
	
	public function rewind()
	{
		reset($this->array);
		$this->next();
	}
	
	public function valid()
	{
		return $this->key!==NULL;
	}
	
	public function key()
	{
		return  $this->key;
	}
	
	public function current()
	{
		return $this->current;	
	}
	
	public function next()
	{
		list($key,$current)=each($this->array);
		$this->key=$key;
		$this->current=$current;
	}
}
?>

Mammouth du PHP | 983 Messages

23 mars 2006, 22:46

Ainsi que la classe bench ;)

Mammouth du PHP | 1311 Messages

23 mars 2006, 22:48

a tu veut vraiment tout :wink:
<?php
class bench extends SingletonFactory implements IteratorAggregate
{
	private $marks = array();
	private $time = null;
	private $startTime;
	
	public static final function Singleton($instance_id = null){
		return parent::Singleton(__CLASS__);
	}

	public function startBench($file = __file__ , $line = __line__ ){
		if(isset(parent::$_instance[__class__])){
			$this->startTime = microtime(true);
			$this->marks[0] = array('evenement'=>'start','file'=>$file,'ligne'=>$line,'time'=>0); 
		}
	}
	
	public function addEvent($evenement,$file = __file__,$line = __line__){
		$array = array( 'evenement'=>$evenement, 'file'=>$file, 'line'=>$line, 'time'=>$this->calcul());
		array_push($this->marks,$array);
	}
	
	private function calcul(){
		return (double)microtime(true)-$this->startTime;
	}
	
	public function getIterator(){
		$iterator = new Iterators($this->marks);
		return $iterator;
	}
}
?>

Mammouth du PHP | 983 Messages

23 mars 2006, 22:55

Oubli d'un slash dans le chemin donné c:/wamp/www

Mammouth du PHP | 1311 Messages

23 mars 2006, 22:59

ca fonctionne chez toi??
car moi ca na rien changé

Mammouth du PHP | 983 Messages

23 mars 2006, 23:02

A partir du moment où je fournis un répertoire qui existe, ca fonctionne :
J'obtiens un truc du genre :
Array ( [evenement] => start [file] => D:\Mes Documents\Cdila\Maia\www\tests\toto.php [ligne] => 12 [time] => 0 ) Array ( [evenement] => c'est partie [file] => D:\Mes Documents\Cdila\Maia\www\tests\toto.php [line] => 19 [time] => 0.00019097328186 ) Array ( [evenement] => stop [file] => D:\Mes Documents\Cdila\Maia\www\tests\toto.php [line] => 19 [time] => 0.091845035553 ) object(RecursiveDirectoryIterator)#4 (0) { } object(RecursiveDirectoryIterator)#4 (0) { } 
...
36
[/code]

Mammouth du PHP | 1311 Messages

23 mars 2006, 23:10

pour etre plus precis c'est ce bout de code qui plante
foreach ($dir as $val){
	echo var_dump($val);
	echo $val->current();
	//echo $val->current()/*.'---'.$val->getSize().'---'.$val->getType().'<br/>'*/;
}
le dump fonctionne
mais pas $val->current();