Рекурсивное удаление файлов и директорий на PHP

Рассказываю, как с помощью PHP удалять директории с файлами.

Удалить файл, группу файлов или пустые директории на PHP достаточно просто — для этого есть UnLink и RmDir. Но как быть если нужно удалить не пустые директории с массой файлов и вложенных поддиректорий? Для этого существует рекурсивное удаление.

$dirPath = 'samples/';
public static function deleteDir($dirPath) {
    if (! is_dir($dirPath)) {
        throw new InvalidArgumentException("$dirPath must be a directory");
    }
    if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
        $dirPath .= '/';
    }
    $files = glob($dirPath . '*', GLOB_MARK);
    foreach ($files as $file) {
        if (is_dir($file)) {
            self::deleteDir($file);
        } else {
            unlink($file);
        }
    }
    rmdir($dirPath);
}

В PHP 5.2 и выше данную процедуру можно проделать с помощью RecursiveIterator.

$dir = 'samples' . DIRECTORY_SEPARATOR . 'sampledirtree';
$it = new RecursiveDirectoryIterator($dir);
$files = new RecursiveIteratorIterator($it,
             RecursiveIteratorIterator::CHILD_FIRST);
foreach($files as $file) {
    if ($file->getFilename() === '.' || $file->getFilename() === '..') {
        continue;
    }
    if ($file->isDir()){
        rmdir($file->getRealPath());
    } else {
        unlink($file->getRealPath());
    }
}
rmdir($dir);
Иван Данилин
Автор Иван Данилин

Делаю сайты на Вордпресс с 2008 года, в том числе уникальные инструменты для решения сложных бизнес‑задач.

Подробнее
Комментарии
    • Там вообще условие не нужно, если язык знать. При создании итератора нужно передать конструктору в качестве аргумента — FilesystemIterator::SKIP_DOTS
Добавить комментарий
PHP