Не рекурсивный обход вложенных файлов и папок
Всем известен лёгкий алгоритм рекурсивного обхода вложенных файлов и папок. Предлагаю не рекурсивный вариант на примере удаления папки.
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 (в среднем)
/** * 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); }мда, хороший скрипт. Но рекурсивный)