← Tutti gli articoliPHP e database

PHP e database

Come svuotare una cartella con php

Matteo Galacci ·

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.

Fonti e approfondimenti