Svuotare una directory è un’operazione distruttiva. Per una cartella temporanea gestita dall’applicazione è preferibile usare le API PHP e una destinazione fissa. L’esempio cancella soltanto file e collegamenti presenti al primo livello: non attraversa sottocartelle.
function clearTemporaryFiles(string $directory): void
{
$path = realpath($directory);
$allowed = realpath(__DIR__ . '/var/temporary');
if ($path === false || $allowed === false || $path !== $allowed
|| is_link($directory)) {
throw new InvalidArgumentException('Directory non autorizzata');
}
$entries = iterator_to_array(new FilesystemIterator(
$path, FilesystemIterator::SKIP_DOTS
));
foreach ($entries as $entry) {
if ($entry->isDir() && !$entry->isLink()) {
throw new RuntimeException('Sottocartella presente: operazione annullata');
}
}
foreach ($entries as $entry) {
if (!unlink($entry->getPathname())) {
throw new RuntimeException('Cancellazione non riuscita');
}
}
}Crea prima la cartella var/temporary sotto la directory dello script e adattala consapevolmente al progetto. I file nascosti sono inclusi; un link viene eliminato senza cancellare il suo bersaglio. La funzione non è transazionale: un errore durante la cancellazione può lasciare un lavoro parziale. Usala solo su una directory privata, non modificabile contemporaneamente da utenti non fidati; i controlli preliminari non eliminano le race condition.
Prova in una cartella dedicata
Salva la funzione in prova.php, preceduta da <?php, dentro una nuova cartella di test. Aggiungi il seguente codice ed esegui php prova.php con PHP 8:
mkdir(__DIR__ . '/var/temporary', 0700, true);
file_put_contents(__DIR__ . '/var/temporary/prova.txt', 'test');
clearTemporaryFiles(__DIR__ . '/var/temporary');
echo count(iterator_to_array(new FilesystemIterator(
__DIR__ . '/var/temporary', FilesystemIterator::SKIP_DOTS
))), PHP_EOL;Alla prima esecuzione nella cartella nuova devi ottenere 0 e la directory deve esistere ancora. Prova poi aggiungendo una sottocartella prima della chiamata: la funzione deve rifiutare l’operazione. L’esempio non realizza una cancellazione ricorsiva.