1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| // Fonction de renommage : si fichier.ext existe, renomme en fichier1.ext ; si fichier1.ext existe, renomme en fichier2.ext etc..
function Rename_fich($adresse_fichier)
{
// si le nom du fichier existe déjà
if (is_file($adresse_fichier))
{
$info = pathinfo($adresse_fichier);
$extension = isset($info['extension'])? '.'.$info['extension'] : null;
$dossier = $info['dirname'];
$basename = $info['basename'];
// fichier sans extension
// pour compatibilité php 5.1, sinon avec php 5.2 on pourrait récupérer $info['filename']
$filename = isset($extension) && strrpos($basename,$extension) !== false ? substr($basename,0,strrpos($basename,$extension)) : $basename;
//addcslashes pour protéger les points dans les regex (et qu'ils ne soient pas pris pour un caractère spécial réservé)
$file = addcslashes($filename,'.');
// idem sur l'extension
$ext = isset($extension) ? addcslashes($extension,'.') : null;
//expression régulière, cherche les 'nb' (nb = nombre) à la fin du nom d'un fichier
$match = isset($extension)? '#^'.$file.'[0-9]+'.$ext.'$#' : '#^'.$file.'[0-9]+$#';
$tab_identique = array();
// tableau des fichiers correspondants à la recherche en utilisant $match
if(class_exists('RegexIterator')) // test car n'existe qu'à partir de php 5.2
{
$files = new RegexIterator(new DirectoryIterator($dossier),$match);
foreach ($files as $fileinfo) $tab_identique[] = $fileinfo->getFilename();
}
else // pour compatibilité php 5.1
{
$files = new DirectoryIterator($dossier);
foreach ($files as $fileinfo) if (preg_match($match,$fileinfo->getFilename())) $tab_identique[] = $fileinfo->getFilename();
}
// Tri du tableau des résultats par ordre alphabétique
natsort($tab_identique);
// Prend le dernier élément du tableau (qui après tri est celui avec la plus grande incrémentation)
$dernier = array_pop($tab_identique);
// efface le tableau devenu inutile
unset($tab_identique);
// vérifie que dernier élément existe et si oui enlève l'extension
$dernier = isset($dernier) ? basename($dernier,$extension) : "";
// Incrémente le nom du dernier fichier (avec return $matches[1]+1)
$file = preg_replace_callback('#([0-9]+$)#', create_function('$matches','return $matches[1]+1;'), $dernier, '1', $count);
// Si l'incrémentation est réussie (et donc qu'il existait préalablement un fichier incrémenté) on garde le résultat sinon on initialise une incrémentation avec 1
$filename = !empty($count)? $file : $filename.'1';
// On réintègre l'extension si elle existe
$filename = !empty($extension) ? $filename.$extension : $filename;
// on réintègre le dossier pour avoir une adresse complète
$adresse = $dossier.'/'.$filename;
// On refait un test pour voir si ce nom de fichier existe; si non on retourne l'adresse
if (!is_file($adresse)) return $adresse;
else //si oui on repasse par la fonction
return Rename_fich($adresse_fichier);
}
else
{
return $adresse_fichier;
}
} |
Partager