PHP renomear numericamente todos os arquivos no diretório
Pergunta
Eu tenho um script para fazer upload de arquivos e nomeá-los numericamente (digamos 1-15) e quando eu excluo um arquivo (digamos o número 5), quero que os arquivos sejam renomeados por 1-14. Isso funciona bem se eu excluir um arquivo 9 ou menos, se eu excluir algo com mais de 10 anos, ele apaga vários arquivos. Tanto quanto posso dizer, o problema não está com a exclusão, mas a renomeação
Aqui está o pedaço de script com o qual estou tendo problemas:
unlink($path.$img);
$files = natsort(glob("$path/*.jpg"));
$num = 1;
foreach($files as $file) {
$new = 'photo' . $num . '.jpg';
rename($file, dirname($file).'/'.$new);
$num++;
}
Obrigado!
Solução
Exemplo de trabalho do php.net
<?php
$path = "E:\\SERVER\\sudhir\\songs";
$dh = opendir($path);
$i=1;
while (($file = readdir($dh)) !== false) {
if($file != "." && $file != "..") {
echo "<br/>".substr($path."\\".$file, 0,-3)."_mysongs_mp3";
rename($path."\\".$file, substr($path."\\".$file, 0,-3)."_mysongs_mp3");
$i++;
}
}
closedir($dh);
?>
Outras dicas
Isso ocorre porque você está substituindo os arquivos enquanto renomeia.
Imagine a seguinte lista de arquivos depois de excluir o arquivo 11:
1
10
12
2
3
4
5
...
Se agora você começar a renomear, o seguinte acontece:
1 -> 1
10 -> 2
12 -> 3
2 -> already overwritten by 10!
Uma solução: classifique sua matriz usando natsort($files)
antes de renomear.