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

Eléphant du PHP | 135 Messages

17 avr. 2007, 14:26

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.
Des noeuds au cerveau!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 avr. 2007, 15:35

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

17 avr. 2007, 16:17

ok cool,
Avec la fonction scandir par exemple?

David.

Eléphant du PHP | 135 Messages

17 avr. 2007, 16:49

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>';
Des noeuds au cerveau!