PHP

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

1 апреля 2013 667 1

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

Kwork: Все онлайн-услуги по 500 руб.
Kwork: Все онлайн-услуги по 500 руб.
$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);

Автор: Иван Данилин

Практикующий веб-разработчик, специализируюсь на платформе WordPress.

Комментарии
  • Дмитрий Цымбал

    $file->getFilename() === ‘.’ || $file->getFilename() === ‘..’
    зачем сравнения по типу?

Разгоните свой WordPress

Хостинг-провайдер номер один в России — REG.RU

Подробнее