What you’re going to have to do is basically the following:
- Fetch all files from the directory and save them in one
array
using readdir
.
- Treat the name of the searched files and use
usort
to organize things.
- After that, get the first 3 values of the
array
(will be the most recent files) and save in a array
separate.
- Rescan the file name and check which files are not the latest 3 and delete them, use
glob
makes the process easier.
Follow a quick example I did, you can improve some things on it later if you prefer:
<?php
$datetime = array();
$dir = "test";
$handle = opendir($dir);
if ($handle) {
while ( $entry = readdir($handle) ) {
// Não sei porquê aqui listou 2 arquivos inexistentes com nomes "." e "..", não sei mesmo.
// Então montei essa condição, se você ver o erro no código me avise por favor.
if ( strlen($entry) > 3 ) {
// Adiciona à nossa array os valores no formato YmdHis
array_push( $datetime, str_replace( "-", "", substr($entry, 10, -4) ) );
}
}
closedir($handle);
// Aqui utilizamos o usort pra definir uma função de retorno que compara
// os valores da array.
usort($datetime, "doCompare");
// Aqui já sabemos que os 3 arquivos mais recentes são os 3 primeiros da array
// Criamos uma array auxiliar para remontarmos o nome completo dos arquivos
$leave = array_slice($datetime, 0, 3);
$leave_files = array();
foreach ($leave as $key => $value) {
array_push($leave_files, $dir . "/db-backup-" . date("Ymd-His", strtotime($value)) . ".txt");
}
// Usamos um glob para pegar os nomes dos arquivos do diretório
$files = glob( $dir . "/*");
foreach ($files as $file) {
// Verifica se o arquivo NÃO ESTÁ na array de arquivos a serem mantidos
// Se não estiver, tenta deletar o arquivo
if ( !in_array($file, $leave_files) ) {
if ( unlink($file) ) {
echo "- Arquivo deletado: " . $file . "<br />";
} else {
echo "Falha no arquivo: " . $file . "<br />";
}
} else {
echo "+ Arquivo mantido: " . $file . "<br />";
}
}
}
function doCompare($a, $b) {
$t1 = strtotime($a);
$t2 = strtotime($b);
return ($t2 - $t1);
}
List of all files in the directory before execution:
db-backup-20131111-224750.txt
db-backup-20140101-001712.txt
db-backup-20140123-153000.txt
db-backup-20140308-034000.txt
db-backup-20150101-001712.txt
db-backup-20150220-132907.txt
db-backup-20140123-153702.txt
db-backup-20140123-153212.txt
Exit from execution:
- Arquivo deletado: test/db-backup-20131111-224750.txt
- Arquivo deletado: test/db-backup-20140101-001712.txt
- Arquivo deletado: test/db-backup-20140123-153000.txt
- Arquivo deletado: test/db-backup-20140123-153212.txt
- Arquivo deletado: test/db-backup-20140123-153702.txt
+ Arquivo mantido: test/db-backup-20140308-034000.txt
+ Arquivo mantido: test/db-backup-20150101-001712.txt
+ Arquivo mantido: test/db-backup-20150220-132907.txt
the above code will not also delete the file itself that runs it? If it happens to be in the same directory as the files to be removed.
– Wesley
Then you have to be very stupid to put the script in the same folder where the files will be deleted right... @Wesley
– Daniel Omine
kkkk, you’ll know... at least it worked here :) thank you.
– Wesley