Главная > PHP > Не рекурсивный обход вложенных файлов и папок

Не рекурсивный обход вложенных файлов и папок

Всем известен лёгкий алгоритм рекурсивного обхода вложенных файлов и папок. Предлагаю не рекурсивный вариант на примере удаления папки.

function removeDir($path)
{
    $adpath = "";
    while(($dir = opendir($path.$adpath)) !== false)
    {
        $wm = false;
        // < действие над каталогом до обработки файлов>

        // < / действие над каталогом до обработки файлов>

        while(($elem = readdir($dir)) !== false)
        {
            if($elem == "." || $elem == "..")
            {
                continue;
            }

            if(is_dir($path.$adpath."/".$elem))
            {
                $adpath = $adpath."/".$elem;
                $wm = true;
                break;
            }

            if(is_file($path.$adpath."/".$elem))
            {
                // < Обработка файлов>
                // например unlink($path.$adpath."/".$elem);
                // < / Обработка файлов>
            }
        }

        closedir($dir);
        if($wm)
        {
            continue;
        }        

        // < действие над каталогом после обработки файлов>
        // например rmdir($path.$adpath);
        // < / действие над каталогом после обработки файлов>

        if(substr_count($adpath, "/") == 0)
        {
            break;
        }
        $adpath = substr($adpath, 0, strrpos($adpath, "/"));
    }

    return true;
}

Тесты показали, что
рекурсивный метод съедает памяти – 11kb (в среднем)
не рекурсивный метод съедает памяти – 5kb (в среднем)
Кол-во удаляемых файлов – 5262, папок – 1696.

По скорости они почти равны, можно только заметить что не рекурсивный, буквально, на малость, быстрее.
рекурсивный метод ~ 0,315 (в среднем)
не рекурсивный метод ~ 0,302 (в среднем)

Categories: PHP Tags:
  1. Добрый дядя с пулеметом
    12 Апрель 2009 в 23:31 | #1
    /**
     * Function for recursive removal of a nonempty directory
     **/
    function removeDir($dir)
    {
        if ($objs = glob($dir."/*")) {
            foreach($objs as $obj) {
                is_dir($obj) ? removeDir($obj) : unlink($obj);
            }
        }
        @rmdir($dir);
    }
  2. 13 Апрель 2009 в 10:54 | #2

    мда, хороший скрипт. Но рекурсивный)

  1. Пока что нет уведомлений.