What you're going to have to do is basically the following:
Search all files in the directory and save them in array
using readdir
.
Treat the name of the searched files and use usort
to organize things.
After that, get the first 3 values of array
(will be the most recent files) and save in a array
separated.
Retrieve the files name and check which files are not the latest 3 and delete them, use glob
for this makes the process easier.
Here is a quick example I made, 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 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 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