Page 1 sur 1

passe deux fois sur les même fichier en lisant un dossier

Posté : 17 avr. 2007, 14:26
par Davee
Bonjour,
<?php
 function ext($f){
   $exta =strtolower(end( explode('.', $f)));
   return $exta;
   }
 function countSplit ($sc){
	$sc= preg_replace('/\W$/', '', $sc);
	$expchr=explode ('\\', $sc);
	$sc=end($expchr);
	return $sc;
	}
//_____variables_______________________________________________________________
$i=0; 
$o='20';
$chem="imagedir\HDT\\";
//_________________________________________
if ( is_dir ($chem)){
	$handle = opendir($chem);
   while (false !== ($renam = readdir($handle))) {
    if ($renam !== "." && $renam!== ".." && $renam !=="Thumbs.db"){
	$listimg= array($renam);
	$count=count($listimg);
	echo $count;
	foreach ( $listimg as  $num=>$name){
		$name_type=ext ($name);
		$oldf=$chem.$name;
		$r = str_pad($o, 5, "0", STR_PAD_LEFT); 
		$newname='HDT'.$r.'.tif';
		$newf=$chem.$newname;
		if ( $name_type=='tif'|'tiff' && !file_exists ($newf)){
			rename ("$oldf", "$newf");
			$nf= countSplit ($newf);
			echo'---new name:'.$nf.'<br>';
			$o++;
			}elseif (is_dir ($oldf)){
			echo $oldf .": is a folder.<br>";
			}else{
			echo $name.":  is not valid<br>";
			}
		}						
	}
   }
closedir ($handle);
}else{
	echo "dir isn't correct.";
}
?> 
Ce script est fait pour renommer un paquet d'image dans un dossier.
Quand le script est lu une première fois, il renomme toutes les images comme prévu, mais ensuite repasse une deuxième fois sur les images, et incrémente donc le numéro dont elle ont déjà.
Au totale si j'ai 4 image dans le dossier il m'en renomme huit.
Par contre si je relance le script tout de suite après, ben il me renomme les image en passant qu'une seule fois.
J'y comprends plus rien.

Merci d'avance pour votre aide.

David.

Posté : 17 avr. 2007, 15:35
par Ryle
C'est sans doute parce que tu parcours le dossier et renomme tes fichiers dans le même temps. Il suffit que le fichier renommé vienne s'ajouter à la fin du dossier pour que ta boucle de lecture le prenne à nouveau en compte.
Chais pas si c'est très clair.. en gros je pense que si tu as un fichier "aa" que tu renommes "zz", la boucle continuera à lire les fichiers à partir de son pointeur et trouvera un fichier nommé "zz" qu'il tentera de renommer une seconde fois.

Le plus simple est donc de le faire en deux temps : lire le dossier et lister tous les fichiers dans un tableau (qui lui ne bougera plus), puis parcourir le tableau pour connaitre le nom des fichiers et les renommer :)

Posté : 17 avr. 2007, 16:17
par Invité
ok cool,
Avec la fonction scandir par exemple?

David.

Posté : 17 avr. 2007, 16:49
par Davee
Zut oublié de me reconnecter
Bon je met un petit code que j'ai trouvé et qui boucle pas deux fois comme j'ai expliqué au dessus.
$dirlisting=array();
$dir    = 'dirprout';

//___________

$files1 = scandir($dir);
 foreach($files1 as $key => $value){ 
    if ($value != '.' && $value != '..' && $value!='Thumbs.db'){
      $dirlisting[] = $value;
    }
  }
print_r($files1);
echo '<br>';
print_r($dirlisting);
echo '<br>';